From 8e13c4d00851205565447f80b5f060a7b199173a Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Sun, 8 Jun 2008 16:16:17 +0100 Subject: [PATCH] Fix race condition in daemon --- src/display_cow.c | 9 +++++---- src/display_cow.h | 2 +- src/xcowsayd.c | 14 +++++++++++--- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/display_cow.c b/src/display_cow.c index 08b0798..dd137a2 100644 --- a/src/display_cow.c +++ b/src/display_cow.c @@ -319,7 +319,7 @@ static int count_words(const char *s) return words; } -void display_cow(bool debug, const char *text) +void display_cow(bool debug, const char *text, bool run_main) { char *text_copy = copy_string(text); @@ -390,8 +390,9 @@ void display_cow(bool debug, const char *text) gdk_window_set_events(shape_window(xcowsay.cow)->window, events); g_signal_connect(G_OBJECT(shape_window(xcowsay.cow)), "button-press-event", G_CALLBACK(cow_clicked), NULL); - - gtk_main(); + + if (run_main) + gtk_main(); g_object_unref(xcowsay.bubble_pixbuf); xcowsay.bubble_pixbuf = NULL; @@ -442,5 +443,5 @@ bool try_dbus(bool debug, const char *text) void display_cow_or_invoke_daemon(bool debug, const char *text) { if (!try_dbus(debug, text)) - display_cow(debug, text); + display_cow(debug, text, true); } diff --git a/src/display_cow.h b/src/display_cow.h index d8ac348..bb62fa0 100644 --- a/src/display_cow.h +++ b/src/display_cow.h @@ -29,7 +29,7 @@ #define debug_err(...) if (debug) g_printerr(__VA_ARGS__); // Show a cow with the given string and clean up afterwards -void display_cow(bool debug, const char *text); +void display_cow(bool debug, const char *text, bool run_main); void display_cow_or_invoke_daemon(bool debug, const char *text); void cowsay_init(int *argc, char ***argv); diff --git a/src/xcowsayd.c b/src/xcowsayd.c index fca415f..6185fc3 100644 --- a/src/xcowsayd.c +++ b/src/xcowsayd.c @@ -56,6 +56,8 @@ typedef struct _cowsay_queue_t { static cowsay_queue_t *requests = NULL; static GMutex *queue_lock = NULL; static GCond *request_ready = NULL; +static GMutex *display_lock = NULL; +static GCond *display_complete = NULL; #define QUEUE_MUTEX_LOCK g_mutex_lock(queue_lock) #define QUEUE_MUTEX_UNLOCK g_mutex_unlock(queue_lock) @@ -127,8 +129,10 @@ static gpointer cow_display_thread(gpointer data) // GTK assumes it is being called from the main thread // (and it isn't here) gdk_threads_enter(); - display_cow(debug, mess); + display_cow(debug, mess, false); gdk_threads_leave(); + + g_cond_wait(display_complete, display_lock); request_complete(); } @@ -226,6 +230,8 @@ void run_cowsay_daemon(bool debug, int argc, char **argv) queue_lock = g_mutex_new(); request_ready = g_cond_new(); + display_complete = g_cond_new(); + display_lock = g_mutex_new(); cowsay_init(&argc, &argv); @@ -236,8 +242,10 @@ void run_cowsay_daemon(bool debug, int argc, char **argv) g_assert(displ); debug_msg("Cowsay daemon starting...\n"); - GMainLoop *main_loop = g_main_loop_new(NULL, FALSE); - g_main_loop_run(main_loop); + for (;;) { + gtk_main(); + g_cond_signal(display_complete); + } exit(EXIT_SUCCESS); } -- 2.39.2