[libsoup/gresolver] Update SoupAddress to use g_main_context_push/pop_thread_default()



commit d39f333e98c1e62e2527ad13e89c9a5d468dadeb
Author: Dan Winship <danw gnome org>
Date:   Tue Jun 23 12:05:45 2009 -0400

    Update SoupAddress to use g_main_context_push/pop_thread_default()

 libsoup/soup-address.c |   46 ++++++----------------------------------------
 1 files changed, 6 insertions(+), 40 deletions(-)
---
diff --git a/libsoup/soup-address.c b/libsoup/soup-address.c
index 947c523..6b9bc03 100644
--- a/libsoup/soup-address.c
+++ b/libsoup/soup-address.c
@@ -660,37 +660,6 @@ idle_complete_resolve (gpointer res_data)
 	return FALSE;
 }
 
-static void
-resolve_for_context (gpointer thread_data, gpointer pool_data)
-{
-	SoupAddressResolveAsyncData *res_data = thread_data;
-
-	res_data->status =
-		soup_address_resolve_sync (res_data->addr,
-					   res_data->cancellable);
-	soup_add_completion (res_data->async_context,
-			     idle_complete_resolve, res_data);
-}
-
-static void
-resolve_in_thread (SoupAddressResolveAsyncData *res_data,
-		   GMainContext *async_context, GCancellable *cancellable)
-{
-	static volatile GThreadPool *thread_pool = NULL;
-
-	if (g_once_init_enter ((gsize *)&thread_pool)) {
-		GThreadPool *pool = g_thread_pool_new (resolve_for_context,
-						       NULL, -1, FALSE, NULL);
-		g_once_init_leave ((gsize *)&thread_pool,
-				   GPOINTER_TO_SIZE (pool));
-	}
-
-	res_data->async_context = g_main_context_ref (async_context);
-	if (cancellable)
-		res_data->cancellable = g_object_ref (cancellable);
-	g_thread_pool_push ((GThreadPool *)thread_pool, res_data, NULL);
-}
-
 /**
  * SoupAddressCallback:
  * @addr: the #SoupAddress that was resolved
@@ -743,17 +712,11 @@ soup_address_resolve_async (SoupAddress *addr, GMainContext *async_context,
 		return;
 	}
 
-	/* GResolver doesn't (yet!) do non-default contexts, so to
-	 * support that we need to synchronously resolve in another
-	 * thread and then send the answer back to the right context.
-	 */
-	if (async_context && async_context != g_main_context_default ()) {
-		resolve_in_thread (res_data, async_context, cancellable);
-		return;
-	}
-
 	resolver = g_resolver_get_default ();
 
+	if (async_context && async_context != g_main_context_default ())
+		g_main_context_push_thread_default (async_context);
+
 	if (priv->name) {
 		res_data->lookup_name = TRUE;
 		g_resolver_lookup_by_name_async (resolver, priv->name,
@@ -770,6 +733,9 @@ soup_address_resolve_async (SoupAddress *addr, GMainContext *async_context,
 		g_object_unref (gia);
 	}
 
+	if (async_context && async_context != g_main_context_default ())
+		g_main_context_push_thread_default (async_context);
+
 	g_object_unref (resolver);
 }
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]