GSimpleAsyncResult: push thread context around callback
authorDan Winship <danw@gnome.org>
Wed, 20 Apr 2011 15:41:47 +0000 (11:41 -0400)
committerDan Winship <danw@gnome.org>
Tue, 26 Apr 2011 15:32:11 +0000 (11:32 -0400)
When an old pre-thread-default-context API that takes an explicit
GMainContext wants to call a gio API, it must call
g_main_context_push_thread_default() before, and
g_main_context_pop_thread_default() after the gio call, so that the
gio method will return its result to the desired GMainContext.

But this fails for methods like g_socket_client_connect_async() that
make a chain of multiple async calls, since the pushed/popped context
will only affect the initial call.

Fix this by having GSimpleAsyncResult itself push/pop the context
around the callback invocation, so that if the callback queues another
async request, it will stay in the same context as the original one.

https://bugzilla.gnome.org/show_bug.cgi?id=646957

gio/gsimpleasyncresult.c

index b58b2e5..4fd5da7 100644 (file)
@@ -744,9 +744,13 @@ g_simple_async_result_complete (GSimpleAsyncResult *simple)
 #endif
 
   if (simple->callback)
-    simple->callback (simple->source_object,
-                     G_ASYNC_RESULT (simple),
-                     simple->user_data);
+    {
+      g_main_context_push_thread_default (simple->context);
+      simple->callback (simple->source_object,
+                       G_ASYNC_RESULT (simple),
+                       simple->user_data);
+      g_main_context_pop_thread_default (simple->context);
+    }
 }
 
 static gboolean