From 9b28f921bebb5afdf1369e4eebd6cd06f459f989 Mon Sep 17 00:00:00 2001 From: YoungHun Kim Date: Thu, 17 Oct 2019 11:50:58 +0900 Subject: Wait until context is owned by worker thread to avoid context owner warning Change-Id: I18dca7760010d882584ab9feb5aba34eb005127b --- packaging/murphy.spec | 2 +- src/common/glib-glue.c | 31 +++++++++++++++++++++++++++---- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/packaging/murphy.spec b/packaging/murphy.spec index ecf897a..6949b37 100644 --- a/packaging/murphy.spec +++ b/packaging/murphy.spec @@ -29,7 +29,7 @@ Summary: Resource policy framework Name: murphy Version: 0.0.75 -Release: 17 +Release: 18 License: BSD-3-Clause Group: System/Service URL: http://01.org/murphy/ diff --git a/src/common/glib-glue.c b/src/common/glib-glue.c index a1f7275..b060e8f 100644 --- a/src/common/glib-glue.c +++ b/src/common/glib-glue.c @@ -45,6 +45,7 @@ typedef struct { GMutex glue_internal_lock; GCond loop_cond; gint ref_count; + gboolean thread_ready; } glib_glue_t; @@ -477,6 +478,7 @@ static void unregister(void *data) } g_mutex_unlock(&glue->glue_internal_lock); + g_main_context_unref(loop_ctx); glue_unref(glue); } @@ -500,12 +502,18 @@ thread_main (gpointer data) g_return_val_if_fail(glue, NULL); GMainContext *thread_main_context = g_main_loop_get_context(glue->gml); - /* Set up the thread’s context and run it. */ - g_main_context_push_thread_default (thread_main_context); + /* Set up the thread's context and run it. */ + g_main_context_push_thread_default(thread_main_context); - g_main_loop_run (glue->gml); + g_mutex_lock(&glue->glue_internal_lock); + glue->thread_ready = TRUE; + g_cond_signal(&glue->loop_cond); + g_mutex_unlock(&glue->glue_internal_lock); - g_main_context_pop_thread_default (thread_main_context); + g_main_loop_run(glue->gml); + g_main_loop_unref(glue->gml); + + g_main_context_pop_thread_default(thread_main_context); g_mutex_lock(&glue->glue_internal_lock); g_cond_signal(&glue->loop_cond); @@ -514,6 +522,16 @@ thread_main (gpointer data) return NULL; } + +static gboolean check_owner(gpointer data) +{ + if (data != NULL) + g_assert(data == g_thread_self()); + + return FALSE; +} + + int mrp_mainloop_register_with_glib(mrp_mainloop_t *ml, GMainLoop *gml) { glib_glue_t *glue; @@ -534,6 +552,11 @@ int mrp_mainloop_register_with_glib(mrp_mainloop_t *ml, GMainLoop *gml) mrp_log_error("Thread creation failed"); return FALSE; } + g_mutex_lock(&glue->glue_internal_lock); + while (!glue->thread_ready) + g_cond_wait(&glue->loop_cond, &glue->glue_internal_lock); + g_mutex_unlock(&glue->glue_internal_lock); + g_main_context_invoke(loop_ctx, check_owner, glue->worker); } return TRUE; } -- cgit v1.2.3