summaryrefslogtreecommitdiffstats
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
parent844de7d4b6d29d57a5425dcc7d0d3f6d4b005311 (diff)
cleanly shutdown event logging thread
-rw-r--r--src/ck-event-logger.c28
-rw-r--r--src/ck-log-event.h8
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;