diff options
author | William Jon McCann <jmccann@redhat.com> | 2008-05-05 15:12:39 -0400 |
---|---|---|
committer | William Jon McCann <jmccann@redhat.com> | 2008-05-05 15:12:39 -0400 |
commit | dfcab49480565a7bcf71752c5b39eb367df81a19 (patch) | |
tree | 7ae0cc131fc123a2fc24d4012942a0c17f93156e | |
parent | 844de7d4b6d29d57a5425dcc7d0d3f6d4b005311 (diff) |
cleanly shutdown event logging thread
-rw-r--r-- | src/ck-event-logger.c | 28 | ||||
-rw-r--r-- | src/ck-log-event.h | 8 |
2 files changed, 32 insertions, 4 deletions
diff --git a/src/ck-event-logger.c b/src/ck-event-logger.c index 2fded87..92bf987 100644 --- a/src/ck-event-logger.c +++ b/src/ck-event-logger.c @@ -254,12 +254,16 @@ writer_thread_start (CkEventLogger *event_logger) { CkLogEvent *event; - while ((event = g_async_queue_pop (event_logger->priv->event_queue)) != NULL) { + while (1) { + event = g_async_queue_pop (event_logger->priv->event_queue); + if (event == NULL || event->type == CK_LOG_EVENT_NONE) { + break; + } write_log_for_event (event_logger, event); ck_log_event_free (event); } - g_thread_exit (NULL); + g_debug ("Writer thread received None event - exiting"); return NULL; } @@ -274,7 +278,7 @@ create_writer_thread (CkEventLogger *event_logger) event_logger->priv->writer_thread = g_thread_create_full ((GThreadFunc)writer_thread_start, event_logger, 65536, - FALSE, + TRUE, TRUE, G_THREAD_PRIORITY_NORMAL, &error); @@ -284,6 +288,22 @@ create_writer_thread (CkEventLogger *event_logger) } } +static void +destroy_writer_thread (CkEventLogger *event_logger) +{ + CkLogEvent event; + + event.type = CK_LOG_EVENT_NONE; + + g_debug ("Destroying writer thread"); + g_async_queue_push (event_logger->priv->event_queue, + &event); +#if 1 + g_debug ("Joining writer thread"); + g_thread_join (event_logger->priv->writer_thread); +#endif +} + static GObject * ck_event_logger_constructor (GType type, guint n_construct_properties, @@ -394,6 +414,8 @@ ck_event_logger_finalize (GObject *object) g_return_if_fail (event_logger->priv != NULL); + destroy_writer_thread (event_logger); + if (event_logger->priv->event_queue != NULL) { g_async_queue_unref (event_logger->priv->event_queue); } diff --git a/src/ck-log-event.h b/src/ck-log-event.h index 149f49b..64dec58 100644 --- a/src/ck-log-event.h +++ b/src/ck-log-event.h @@ -27,7 +27,8 @@ G_BEGIN_DECLS typedef enum { - CK_LOG_EVENT_START = 0, + CK_LOG_EVENT_NONE = 0, + CK_LOG_EVENT_START, CK_LOG_EVENT_STOP, CK_LOG_EVENT_SYSTEM_START, CK_LOG_EVENT_SYSTEM_STOP, @@ -44,6 +45,10 @@ typedef enum typedef struct { +} CkLogNoneEvent; + +typedef struct +{ } CkLogSystemStopEvent; typedef struct @@ -117,6 +122,7 @@ typedef struct typedef struct { union { + CkLogNoneEvent none; CkLogSystemRestartEvent system_start; CkLogSystemStopEvent system_stop; CkLogSystemRestartEvent system_restart; |