From b93b05653ee66728b80960e923aa967cb30fc0c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Mon, 31 Jan 2011 15:58:18 +0000 Subject: [PATCH] bus: honour any per-thread default main context set via g_main_thread_push_thread_default() Makes gst_bus_add_watch(), gst_bus_add_watch_full(), gst_bus_add_signal_watch(), and gst_bus_add_signal_watch_full() convenience functions automatically pick up any non-default main contexts set for the current thread via g_main_thread_push_thread_default(). --- gst/gstbus.c | 28 +++++++++++++++++++++----- tests/check/gst/gstbus.c | 43 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 5 deletions(-) diff --git a/gst/gstbus.c b/gst/gstbus.c index f1096eab32..bca4558016 100644 --- a/gst/gstbus.c +++ b/gst/gstbus.c @@ -831,6 +831,7 @@ static guint gst_bus_add_watch_full_unlocked (GstBus * bus, gint priority, GstBusFunc func, gpointer user_data, GDestroyNotify notify) { + GMainContext *ctx; guint id; GSource *source; @@ -847,7 +848,8 @@ gst_bus_add_watch_full_unlocked (GstBus * bus, gint priority, g_source_set_callback (source, (GSourceFunc) func, user_data, notify); - id = g_source_attach (source, NULL); + ctx = g_main_context_get_thread_default (); + id = g_source_attach (source, ctx); g_source_unref (source); if (id) { @@ -867,7 +869,11 @@ gst_bus_add_watch_full_unlocked (GstBus * bus, gint priority, * @notify: the function to call when the source is removed. * * Adds a bus watch to the default main context with the given @priority (e.g. - * %G_PRIORITY_DEFAULT). + * %G_PRIORITY_DEFAULT). Since 0.10.33 it is also possible to use a non-default + * main context set up using g_main_context_push_thread_default() (before + * one had to create a bus watch source and attach it to the desired main + * context 'manually'). + * * This function is used to receive asynchronous messages in the main loop. * There can only be a single bus watch per bus, you must remove it before you * can set a new one. @@ -904,7 +910,11 @@ gst_bus_add_watch_full (GstBus * bus, gint priority, * @user_data: user data passed to @func. * * Adds a bus watch to the default main context with the default priority - * (%G_PRIORITY_DEFAULT). + * (%G_PRIORITY_DEFAULT). Since 0.10.33 it is also possible to use a non-default + * main context set up using g_main_context_push_thread_default() (before + * one had to create a bus watch source and attach it to the desired main + * context 'manually'). + * * This function is used to receive asynchronous messages in the main loop. * There can only be a single bus watch per bus, you must remove it before you * can set a new one. @@ -1195,7 +1205,11 @@ gst_bus_disable_sync_message_emission (GstBus * bus) * @priority: The priority of the watch. * * Adds a bus signal watch to the default main context with the given @priority - * (e.g. %G_PRIORITY_DEFAULT). + * (e.g. %G_PRIORITY_DEFAULT). Since 0.10.33 it is also possible to use a + * non-default main context set up using g_main_context_push_thread_default() + * (before one had to create a bus watch source and attach it to the desired + * main context 'manually'). + * * After calling this statement, the bus will emit the "message" signal for each * message posted on the bus when the main loop is running. * @@ -1250,7 +1264,11 @@ add_failed: * @bus: a #GstBus on which you want to receive the "message" signal * * Adds a bus signal watch to the default main context with the default priority - * (%G_PRIORITY_DEFAULT). + * (%G_PRIORITY_DEFAULT). Since 0.10.33 it is also possible to use a non-default + * main context set up using g_main_context_push_thread_default() (before + * one had to create a bus watch source and attach it to the desired main + * context 'manually'). + * * After calling this statement, the bus will emit the "message" signal for each * message posted on the bus. * diff --git a/tests/check/gst/gstbus.c b/tests/check/gst/gstbus.c index 6519aedd2b..f54d1a59bb 100644 --- a/tests/check/gst/gstbus.c +++ b/tests/check/gst/gstbus.c @@ -241,6 +241,48 @@ GST_START_TEST (test_watch_with_custom_context) GST_END_TEST; +/* test if adding a signal watch for different message types calls the + * respective callbacks. */ +GST_START_TEST (test_add_watch_with_custom_context) +{ + GMainContext *ctx; + GSource *source; + guint num_eos = 0; + guint num_app = 0; + + test_bus = gst_bus_new (); + + ctx = g_main_context_new (); + main_loop = g_main_loop_new (ctx, FALSE); + + g_main_context_push_thread_default (ctx); + gst_bus_add_signal_watch (test_bus); + g_main_context_pop_thread_default (ctx); + + g_signal_connect (test_bus, "message::eos", (GCallback) message_func_eos, + &num_eos); + g_signal_connect (test_bus, "message::application", + (GCallback) message_func_app, &num_app); + + source = g_idle_source_new (); + g_source_set_callback (source, (GSourceFunc) send_messages, NULL, NULL); + g_source_attach (source, ctx); + g_source_unref (source); + + while (g_main_context_pending (ctx)) + g_main_context_iteration (ctx, FALSE); + + fail_unless_equals_int (num_eos, 10); + fail_unless_equals_int (num_app, 10); + + g_main_loop_unref (main_loop); + g_main_context_unref (ctx); + + gst_object_unref (test_bus); +} + +GST_END_TEST; + static gint messages_seen; static void @@ -581,6 +623,7 @@ gst_bus_suite (void) tcase_add_test (tc_chain, test_watch); tcase_add_test (tc_chain, test_watch_with_poll); tcase_add_test (tc_chain, test_watch_with_custom_context); + tcase_add_test (tc_chain, test_add_watch_with_custom_context); tcase_add_test (tc_chain, test_timed_pop); tcase_add_test (tc_chain, test_timed_pop_thread); tcase_add_test (tc_chain, test_timed_pop_filtered);