summaryrefslogtreecommitdiff
path: root/src/common/glib-glue.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/glib-glue.c')
-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;
}