mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-02-13 14:05:05 +01:00
tests: Wait until unsubscribing from a signal has completed
As with the previous commit, don’t stop iterating the `context` in `test_delivery_in_thread_func()` until the unsubscription from a signal is complete, and hence there’s a guarantee that no callbacks are pending in the `thread_context`. This commit uses the `GDestroyNotify` for `g_dbus_connection_signal_subscribe()` as a synchronisation message from the D-Bus worker thread to the `test_delivery_in_thread_func()` thread to notify of signal unsubscription. Signed-off-by: Philip Withnall <withnall@endlessm.com> Fixes: #1515
This commit is contained in:
parent
af6dbece87
commit
79ef610f03
@ -82,6 +82,7 @@ typedef struct {
|
|||||||
GThread *thread;
|
GThread *thread;
|
||||||
GMainLoop *thread_loop;
|
GMainLoop *thread_loop;
|
||||||
guint signal_count;
|
guint signal_count;
|
||||||
|
gboolean unsubscribe_complete;
|
||||||
} DeliveryData;
|
} DeliveryData;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -147,6 +148,18 @@ signal_handler (GDBusConnection *connection,
|
|||||||
g_main_loop_quit (data->thread_loop);
|
g_main_loop_quit (data->thread_loop);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
signal_data_free_cb (gpointer user_data)
|
||||||
|
{
|
||||||
|
DeliveryData *data = user_data;
|
||||||
|
|
||||||
|
g_assert_true (g_thread_self () == data->thread);
|
||||||
|
|
||||||
|
data->unsubscribe_complete = TRUE;
|
||||||
|
|
||||||
|
g_main_loop_quit (data->thread_loop);
|
||||||
|
}
|
||||||
|
|
||||||
static gpointer
|
static gpointer
|
||||||
test_delivery_in_thread_func (gpointer _data)
|
test_delivery_in_thread_func (gpointer _data)
|
||||||
{
|
{
|
||||||
@ -167,6 +180,7 @@ test_delivery_in_thread_func (gpointer _data)
|
|||||||
data.thread = g_thread_self ();
|
data.thread = g_thread_self ();
|
||||||
data.thread_loop = thread_loop;
|
data.thread_loop = thread_loop;
|
||||||
data.signal_count = 0;
|
data.signal_count = 0;
|
||||||
|
data.unsubscribe_complete = FALSE;
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
@ -242,7 +256,7 @@ test_delivery_in_thread_func (gpointer _data)
|
|||||||
G_DBUS_SIGNAL_FLAGS_NONE,
|
G_DBUS_SIGNAL_FLAGS_NONE,
|
||||||
signal_handler,
|
signal_handler,
|
||||||
&data,
|
&data,
|
||||||
NULL);
|
signal_data_free_cb);
|
||||||
g_assert_cmpuint (subscription_id, !=, 0);
|
g_assert_cmpuint (subscription_id, !=, 0);
|
||||||
g_assert_cmpuint (data.signal_count, ==, 0);
|
g_assert_cmpuint (data.signal_count, ==, 0);
|
||||||
|
|
||||||
@ -256,6 +270,10 @@ test_delivery_in_thread_func (gpointer _data)
|
|||||||
g_object_unref (priv_c);
|
g_object_unref (priv_c);
|
||||||
|
|
||||||
g_dbus_connection_signal_unsubscribe (c, subscription_id);
|
g_dbus_connection_signal_unsubscribe (c, subscription_id);
|
||||||
|
subscription_id = 0;
|
||||||
|
|
||||||
|
g_main_loop_run (thread_loop);
|
||||||
|
g_assert_true (data.unsubscribe_complete);
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user