summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorYoungHun Kim <yh8004.kim@samsung.com>2019-10-17 11:50:58 +0900
committerYoungHun Kim <yh8004.kim@samsung.com>2019-10-29 09:52:48 +0900
commit6fb024366692f8dbe7b178611f5478ca78608d04 (patch)
tree7dd3e44c3f6d783896eab97c9b7d5cbc1de2ce61 /src
parent1b1317526197c7636f1d3817c72ad2f8d06034a5 (diff)
downloadmurphy-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.c31
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;
}