aboutsummaryrefslogtreecommitdiffstats
path: root/daemon/syslogd.c
diff options
context:
space:
mode:
Diffstat (limited to 'daemon/syslogd.c')
-rw-r--r--daemon/syslogd.c89
1 files changed, 63 insertions, 26 deletions
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: