[evolution-data-server] ECalClient: Pass a weak reference to D-Bus signal handlers.



commit a061418583bfa44c2b5c4968709779b5c0f69f62
Author: Matthew Barnes <mbarnes redhat com>
Date:   Sun Mar 17 11:14:05 2013 -0400

    ECalClient: Pass a weak reference to D-Bus signal handlers.
    
    I don't trust even g_signal_connect_object() to be thread-safe.

 calendar/libecal/e-cal-client.c |   63 +++++++++++++++++++++++++-------------
 1 files changed, 41 insertions(+), 22 deletions(-)
---
diff --git a/calendar/libecal/e-cal-client.c b/calendar/libecal/e-cal-client.c
index 5f25db0..95ce2da 100644
--- a/calendar/libecal/e-cal-client.c
+++ b/calendar/libecal/e-cal-client.c
@@ -534,37 +534,50 @@ cal_client_emit_timezone_added_idle_cb (gpointer user_data)
 static void
 cal_client_dbus_proxy_error_cb (EDBusCalendar *dbus_proxy,
                                 const gchar *error_message,
-                                EClient *client)
+                                GWeakRef *client_weak_ref)
 {
-       GSource *idle_source;
-       GMainContext *main_context;
-       SignalClosure *signal_closure;
+       EClient *client;
 
-       signal_closure = g_slice_new0 (SignalClosure);
-       g_weak_ref_set (&signal_closure->client, client);
-       signal_closure->error_message = g_strdup (error_message);
+       client = g_weak_ref_get (client_weak_ref);
 
-       main_context = e_client_ref_main_context (client);
+       if (client != NULL) {
+               GSource *idle_source;
+               GMainContext *main_context;
+               SignalClosure *signal_closure;
 
-       idle_source = g_idle_source_new ();
-       g_source_set_callback (
-               idle_source,
-               cal_client_emit_backend_error_idle_cb,
-               signal_closure,
-               (GDestroyNotify) signal_closure_free);
-       g_source_attach (idle_source, main_context);
-       g_source_unref (idle_source);
+               signal_closure = g_slice_new0 (SignalClosure);
+               g_weak_ref_set (&signal_closure->client, client);
+               signal_closure->error_message = g_strdup (error_message);
 
-       g_main_context_unref (main_context);
+               main_context = e_client_ref_main_context (client);
+
+               idle_source = g_idle_source_new ();
+               g_source_set_callback (
+                       idle_source,
+                       cal_client_emit_backend_error_idle_cb,
+                       signal_closure,
+                       (GDestroyNotify) signal_closure_free);
+               g_source_attach (idle_source, main_context);
+               g_source_unref (idle_source);
+
+               g_main_context_unref (main_context);
+
+               g_object_unref (client);
+       }
 }
 
 static void
 cal_client_dbus_proxy_notify_cb (EDBusCalendar *dbus_proxy,
                                  GParamSpec *pspec,
-                                 EClient *client)
+                                 GWeakRef *client_weak_ref)
 {
+       EClient *client;
        const gchar *backend_prop_name = NULL;
 
+       client = g_weak_ref_get (client_weak_ref);
+       if (client == NULL)
+               return;
+
        if (g_str_equal (pspec->name, "alarm-email-address")) {
                backend_prop_name = CAL_BACKEND_PROPERTY_ALARM_EMAIL_ADDRESS;
        }
@@ -640,6 +653,8 @@ cal_client_dbus_proxy_notify_cb (EDBusCalendar *dbus_proxy,
 
                g_main_context_unref (main_context);
        }
+
+       g_object_unref (client);
 }
 
 static void
@@ -1097,16 +1112,20 @@ cal_client_init_in_dbus_thread (GSimpleAsyncResult *simple,
                e_weak_ref_new (client),
                (GDestroyNotify) e_weak_ref_free);
 
-       handler_id = g_signal_connect_object (
+       handler_id = g_signal_connect_data (
                proxy, "error",
                G_CALLBACK (cal_client_dbus_proxy_error_cb),
-               client, 0);
+               e_weak_ref_new (client),
+               (GClosureNotify) e_weak_ref_free,
+               0);
        priv->dbus_proxy_error_handler_id = handler_id;
 
-       handler_id = g_signal_connect_object (
+       handler_id = g_signal_connect_data (
                proxy, "notify",
                G_CALLBACK (cal_client_dbus_proxy_notify_cb),
-               client, 0);
+               e_weak_ref_new (client),
+               (GClosureNotify) e_weak_ref_free,
+               0);
        priv->dbus_proxy_notify_handler_id = handler_id;
 
        handler_id = g_signal_connect_object (


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