From a7085384027284f3eb55e48b4c0d4a93bea131b4 Mon Sep 17 00:00:00 2001 From: yaworsky Date: Thu, 10 Nov 2005 02:39:55 +0000 Subject: Improved performance. --- daemon/syslogd.c | 89 +++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 63 insertions(+), 26 deletions(-) (limited to 'daemon/syslogd.c') diff --git a/daemon/syslogd.c b/daemon/syslogd.c index 439152b..dc947b3 100644 --- a/daemon/syslogd.c +++ b/daemon/syslogd.c @@ -29,7 +29,8 @@ /* internal source data */ static struct fifo *internal_message_queue = NULL; -static HANDLE internal_queue_semaphore = NULL; +static HANDLE internal_queue_event = NULL; +static CRITICAL_SECTION internal_queue_cs; static int internal_source_count = 0; static struct source** internal_source_references = NULL; @@ -576,15 +577,17 @@ void log_internal( int pri, char* fmt, ... ) LOG_FAC( LOG_SYSLOG ), LOG_PRI( pri ), &stm, hostname, program, msg ); + EnterCriticalSection( &internal_queue_cs ); for( i = 1;; i++ ) { - fifo_push( internal_message_queue, message ); - ReleaseSemaphore( internal_queue_semaphore, 1, NULL ); + if( fifo_push( internal_message_queue, message ) ) + SetEvent( internal_queue_event ); if( i == internal_source_count ) break; message = duplicate_message( message ); message->source = internal_source_references[ i ]; } + LeaveCriticalSection( &internal_queue_cs ); done: TRACE_LEAVE( "done\n" ); @@ -593,7 +596,7 @@ done: /****************************************************************************** * shutdown_internal_sources * - * dispose all data except message queue and semaphore + * dispose all data except message queue and event */ static void shutdown_internal_sources() { @@ -625,10 +628,11 @@ static void fini_internal_sources() internal_message_queue = NULL; } - if( internal_queue_semaphore ) + if( internal_queue_event ) { - CloseHandle( internal_queue_semaphore ); - internal_queue_semaphore = NULL; + DeleteCriticalSection( &internal_queue_cs ); + CloseHandle( internal_queue_event ); + internal_queue_event = NULL; } TRACE_LEAVE( "done\n" ); @@ -646,12 +650,13 @@ static gboolean init_internal_sources() TRACE_ENTER( "\n" ); internal_message_queue = fifo_create(); - internal_queue_semaphore = CreateSemaphore( NULL, 0, LONG_MAX, NULL ); - if( !internal_queue_semaphore ) + internal_queue_event = CreateEvent( NULL, TRUE, FALSE, NULL ); + if( !internal_queue_event ) { - ERR( "Cannot create semaphore; error %lu\n", GetLastError() ); + ERR( "Cannot create event; error %lu\n", GetLastError() ); goto done; } + InitializeCriticalSection( &internal_queue_cs ); internal_source_count = (int) number_of_sources( ST_INTERNAL ); if( 0 == internal_source_count ) @@ -734,8 +739,8 @@ void syslogd_main() /* get messages from queues */ for(;;) { - HANDLE wait_handles[3] = { udp_queue_semaphore, - internal_queue_semaphore, + HANDLE wait_handles[3] = { udp_queue_event, + internal_queue_event, service_stop_event }; DWORD t; struct raw_message *raw_msg; @@ -749,15 +754,31 @@ void syslogd_main() switch( WaitForMultipleObjects( 3, wait_handles, FALSE, t ) ) { case WAIT_OBJECT_0: - raw_msg = fifo_pop( udp_message_queue ); - TRACE_2( "got raw message %p from UDP listener\n", raw_msg ); - mux_message( parse_raw_message( raw_msg ) ); + EnterCriticalSection( &udp_queue_cs ); + for(;;) + { + raw_msg = fifo_pop( udp_message_queue ); + if( !raw_msg ) + break; + TRACE_2( "got raw message %p from UDP listener\n", raw_msg ); + mux_message( parse_raw_message( raw_msg ) ); + } + ResetEvent( udp_queue_event ); + LeaveCriticalSection( &udp_queue_cs ); break; case WAIT_OBJECT_0 + 1: - msg = fifo_pop( internal_message_queue ); - TRACE_2( "got message %p from internal source %s\n", msg, msg->source->name ); - mux_message( msg ); + EnterCriticalSection( &internal_queue_cs ); + for(;;) + { + msg = fifo_pop( internal_message_queue ); + if( !msg ) + break; + TRACE_2( "got message %p from internal source %s\n", msg, msg->source->name ); + mux_message( msg ); + } + ResetEvent( internal_queue_event ); + LeaveCriticalSection( &internal_queue_cs ); break; case WAIT_OBJECT_0 + 2: @@ -783,23 +804,39 @@ shutdown: /* flush queues */ for(;;) { - HANDLE wait_handles[2] = { udp_queue_semaphore, - internal_queue_semaphore }; + HANDLE wait_handles[2] = { udp_queue_event, + internal_queue_event }; struct raw_message *raw_msg; struct message *msg; switch( WaitForMultipleObjects( 2, wait_handles, FALSE, 0 ) ) { case WAIT_OBJECT_0: - raw_msg = fifo_pop( udp_message_queue ); - TRACE_2( "got raw message %p from UDP listener\n", raw_msg ); - mux_message( parse_raw_message( raw_msg ) ); + EnterCriticalSection( &udp_queue_cs ); + for(;;) + { + raw_msg = fifo_pop( udp_message_queue ); + if( !raw_msg ) + break; + TRACE_2( "got raw message %p from UDP listener\n", raw_msg ); + mux_message( parse_raw_message( raw_msg ) ); + } + ResetEvent( udp_queue_event ); + LeaveCriticalSection( &udp_queue_cs ); break; case WAIT_OBJECT_0 + 1: - msg = fifo_pop( internal_message_queue ); - TRACE_2( "got message %p from internal source %s\n", msg, msg->source->name ); - mux_message( msg ); + EnterCriticalSection( &internal_queue_cs ); + for(;;) + { + msg = fifo_pop( internal_message_queue ); + if( !msg ) + break; + TRACE_2( "got message %p from internal source %s\n", msg, msg->source->name ); + mux_message( msg ); + } + ResetEvent( internal_queue_event ); + LeaveCriticalSection( &internal_queue_cs ); break; case WAIT_TIMEOUT: -- cgit v1.2.3