Wait until context is owned by worker thread to avoid context owner warning 83/216783/1 accepted/tizen_5.5_unified_wearable_hotfix tizen_5.5_tv tizen_5.5_wearable_hotfix accepted/tizen/5.5/unified/20191107.051248 accepted/tizen/5.5/unified/wearable/hotfix/20201027.100148 submit/tizen_5.5/20191105.005038 submit/tizen_5.5_wearable_hotfix/20201026.184307
authorYoungHun Kim <yh8004.kim@samsung.com>
Thu, 17 Oct 2019 02:50:58 +0000 (11:50 +0900)
committerYoungHun Kim <yh8004.kim@samsung.com>
Fri, 1 Nov 2019 04:33:16 +0000 (13:33 +0900)
 - 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

packaging/murphy.spec
src/common/glib-glue.c

index ecf897a88942e6606c454de4e18b46e653c063b3..6949b37e6c52fb63c31e3e5199362556a42d0821 100644 (file)
@@ -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/
index a1f7275c539a128bec4dc7f72b4f4e7602bce792..22816cf34cdba3aa395dd56211f47e3df6e4c712 100644 (file)
@@ -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 threads 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;
         }