[glib: 2/4] tests: Fix unlikely race in socket-service test
- From: Michael Catanzaro <mcatanzaro src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib: 2/4] tests: Fix unlikely race in socket-service test
- Date: Fri, 22 Feb 2019 01:34:16 +0000 (UTC)
commit f25c3f27042c0b96b22d8dabe781b12fff9b08a3
Author: Philip Withnall <withnall endlessm com>
Date: Thu Feb 21 17:45:40 2019 +0000
tests: Fix unlikely race in socket-service test
It’s occasionally possible for the cancellation of the service to happen
before connection_cb() gets scheduled in the other thread. The
locking/unlocking order of mutex_712570 requires:
• test_threaded_712570(): lock mutex
• test_threaded_712570(): start wait loop
• connection_cb(): lock mutex
• test_threaded_socket_service_finalize(): unlock mutex
• test_threaded_712570(): end wait loop
• test_threaded_712570(): unlock mutex
Fix that by quitting the main loop once connection_cb() has been called
(i.e. once the server thread has received the incoming connection
request), rather than just after the client thread (main thread) has
sent a connection request.
Signed-off-by: Philip Withnall <withnall endlessm com>
Helps: #1679
gio/tests/socket-service.c | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)
---
diff --git a/gio/tests/socket-service.c b/gio/tests/socket-service.c
index a5d114f29..dc8bdec23 100644
--- a/gio/tests/socket-service.c
+++ b/gio/tests/socket-service.c
@@ -139,6 +139,12 @@ connection_cb (GThreadedSocketService *service,
GObject *source_object,
gpointer user_data)
{
+ GMainLoop *loop = user_data;
+
+ /* Since the connection attempt has come through to be handled, stop the main
+ * thread waiting for it; this causes the #GSocketService to be stopped. */
+ g_main_loop_quit (loop);
+
/* Block until the main thread has dropped its ref to @service, so that we
* will drop the final ref from this thread.
*/
@@ -158,7 +164,6 @@ client_connected_cb (GObject *client,
GAsyncResult *result,
gpointer user_data)
{
- GMainLoop *loop = user_data;
GSocketConnection *conn;
GError *error = NULL;
@@ -166,7 +171,6 @@ client_connected_cb (GObject *client,
g_assert_no_error (error);
g_object_unref (conn);
- g_main_loop_quit (loop);
}
static void
@@ -195,9 +199,8 @@ test_threaded_712570 (void)
g_assert_no_error (error);
g_object_unref (addr);
- g_signal_connect (service, "run", G_CALLBACK (connection_cb), NULL);
-
loop = g_main_loop_new (NULL, FALSE);
+ g_signal_connect (service, "run", G_CALLBACK (connection_cb), loop);
client = g_socket_client_new ();
g_socket_client_connect_async (client,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]