[dconf] support non-default context for async results



commit 058c8585e82b2b985e2cc303687da712678444d9
Author: Ryan Lortie <desrt desrt ca>
Date:   Fri Oct 2 00:01:45 2009 -0400

    support non-default context for async results

 dconf/dconf-dbus.c |   34 ++++++++++++++++++++++++++++------
 1 files changed, 28 insertions(+), 6 deletions(-)
---
diff --git a/dconf/dconf-dbus.c b/dconf/dconf-dbus.c
index f6fd548..e715966 100644
--- a/dconf/dconf-dbus.c
+++ b/dconf/dconf-dbus.c
@@ -526,6 +526,8 @@ typedef struct
 {
   DConfDBus *bus;
   DConfDBusAsyncReadyCallback callback;
+  GMainContext *context;
+  DBusPendingCall *pending;
   gpointer user_data;
 } DConfDBusClosure;
 
@@ -538,6 +540,7 @@ struct OPAQUE_TYPE__DConfDBusAsyncResult
 static DConfDBusClosure *
 dconf_dbus_closure_new (DConfDBus                   *bus,
                         DConfDBusAsyncReadyCallback  callback,
+                        DBusPendingCall             *pending,
                         gpointer                     user_data)
 {
   DConfDBusClosure *closure;
@@ -545,19 +548,32 @@ dconf_dbus_closure_new (DConfDBus                   *bus,
   closure = g_slice_new (DConfDBusClosure);
   closure->bus = bus;
   closure->callback = callback;
+  closure->pending = dbus_pending_call_ref (pending);
   closure->user_data = user_data;
+  closure->context = g_main_context_get_thread_default ();
+  if (closure->context)
+    g_main_context_ref (closure->context);
 
   return closure;
 }
 
-static void
-dconf_dbus_closure_fire (DConfDBusClosure *closure,
-                         DBusPendingCall  *pending)
+static gboolean
+dconf_dbus_closure_fire (gpointer user_data)
 {
-  DConfDBusAsyncResult result = { closure->bus, pending };
+  DConfDBusClosure *closure = user_data;
+  DConfDBusAsyncResult result;
+
+  result.bus = closure->bus;
+  result.pending = closure->pending;
 
   closure->callback (&result, closure->user_data);
+
+  dbus_pending_call_unref (closure->pending);
+  if (closure->context)
+    g_main_context_unref (closure->context);
   g_slice_free (DConfDBusClosure, closure);
+
+  return FALSE;
 }
 
 static void
@@ -565,8 +581,13 @@ dconf_dbus_async_ready (DBusPendingCall *pending,
                         gpointer         user_data)
 {
   DConfDBusClosure *closure = user_data;
+  GSource *source;
 
-  dconf_dbus_closure_fire (closure, pending);
+  source = g_idle_source_new ();
+  g_source_set_priority (source, G_PRIORITY_DEFAULT);
+  g_source_set_callback (source, dconf_dbus_closure_fire, closure, NULL);
+  g_source_attach (source, closure->context);
+  g_source_unref (source);
 }
 
 static void
@@ -580,8 +601,9 @@ dconf_dbus_async_call (DConfDBus                   *bus,
   dbus_connection_send_with_reply (bus->connection, message, &pending, -1);
   dbus_pending_call_set_notify (pending, dconf_dbus_async_ready,
                                 dconf_dbus_closure_new (bus, callback,
-                                                        user_data),
+                                                        pending, user_data),
                                 NULL);
+  dbus_pending_call_unref (pending);
   dbus_message_unref (message);
 }
 



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