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-29 09:52:48 +0900 |
commit | 6fb024366692f8dbe7b178611f5478ca78608d04 (patch) | |
tree | 7dd3e44c3f6d783896eab97c9b7d5cbc1de2ce61 /src | |
parent | 1b1317526197c7636f1d3817c72ad2f8d06034a5 (diff) | |
download | murphy-6fb024366692f8dbe7b178611f5478ca78608d04.tar.gz murphy-6fb024366692f8dbe7b178611f5478ca78608d04.tar.bz2 murphy-6fb024366692f8dbe7b178611f5478ca78608d04.zip |
Wait until context is owned by worker thread to avoid context owner warningsubmit/tizen/20191029.083414accepted/tizen/unified/20191101.042138
- We must ensure g_main_context_push_thread_default() is executed before
mm-resource-manager return mainloop when calling mrp_mainloop_glib_get()
Change-Id: I18dca7760010d882584ab9feb5aba34eb005127b
Diffstat (limited to 'src')
-rw-r--r-- | src/common/glib-glue.c | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/src/common/glib-glue.c b/src/common/glib-glue.c index a1f7275..22816cf 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; } |