[evolution-data-server] ECalClient: Pass a weak reference to D-Bus signal handlers.
- From: Matthew Barnes <mbarnes src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server] ECalClient: Pass a weak reference to D-Bus signal handlers.
- Date: Sun, 17 Mar 2013 15:23:32 +0000 (UTC)
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]