diff options
author | YoungHun Kim <yh8004.kim@samsung.com> | 2019-10-17 11:50:58 +0900 |
---|---|---|
committer | YoungHun Kim <yh8004.kim@samsung.com> | 2019-10-25 16:10:23 +0900 |
commit | 9b28f921bebb5afdf1369e4eebd6cd06f459f989 (patch) | |
tree | ed21fed545c60506bd20c62b3dfcc64b6f80f5df | |
parent | 36794f38e13ad054f3578bf5894186a8bb2f613f (diff) | |
download | murphy-9b28f921bebb5afdf1369e4eebd6cd06f459f989.tar.gz murphy-9b28f921bebb5afdf1369e4eebd6cd06f459f989.tar.bz2 murphy-9b28f921bebb5afdf1369e4eebd6cd06f459f989.zip |
Wait until context is owned by worker thread to avoid context owner warningsubmit/tizen_4.0/20191029.083447
Change-Id: I18dca7760010d882584ab9feb5aba34eb005127b
-rw-r--r-- | packaging/murphy.spec | 2 | ||||
-rw-r--r-- | 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; } |