summaryrefslogtreecommitdiffstats
path: root/src/ck-event-logger.c
diff options
context:
space:
mode:
authorWilliam Jon McCann <jmccann@redhat.com>2008-05-05 15:12:39 -0400
committerWilliam Jon McCann <jmccann@redhat.com>2008-05-05 15:12:39 -0400
commitdfcab49480565a7bcf71752c5b39eb367df81a19 (patch)
tree7ae0cc131fc123a2fc24d4012942a0c17f93156e /src/ck-event-logger.c
parent844de7d4b6d29d57a5425dcc7d0d3f6d4b005311 (diff)
cleanly shutdown event logging thread
Diffstat (limited to 'src/ck-event-logger.c')
-rw-r--r--src/ck-event-logger.c28
1 files changed, 25 insertions, 3 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);
}