[evolution-data-server] ECalBackend: Use weak references in signal closures.
- From: Matthew Barnes <mbarnes src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server] ECalBackend: Use weak references in signal closures.
- Date: Fri, 8 Mar 2013 15:33:59 +0000 (UTC)
commit deaeb97083f37fd8d437940a794d863146aecf7d
Author: Matthew Barnes <mbarnes redhat com>
Date: Fri Mar 8 09:45:39 2013 -0500
ECalBackend: Use weak references in signal closures.
Helps prevent the object from surviving beyond its natural life.
calendar/libedata-cal/e-cal-backend.c | 19 ++++++++++++-------
1 files changed, 12 insertions(+), 7 deletions(-)
---
diff --git a/calendar/libedata-cal/e-cal-backend.c b/calendar/libedata-cal/e-cal-backend.c
index 328d7bf..f3753f5 100644
--- a/calendar/libedata-cal/e-cal-backend.c
+++ b/calendar/libedata-cal/e-cal-backend.c
@@ -64,7 +64,7 @@ struct _ECalBackendPrivate {
};
struct _SignalClosure {
- ECalBackend *backend;
+ GWeakRef backend;
icaltimezone *cached_zone;
};
@@ -96,7 +96,7 @@ G_DEFINE_TYPE_WITH_CODE (
static void
signal_closure_free (SignalClosure *signal_closure)
{
- g_object_unref (signal_closure->backend);
+ g_weak_ref_set (&signal_closure->backend, NULL);
/* The icaltimezone is cached in ECalBackend's internal
* "zone_cache" hash table and must not be freed here. */
@@ -213,11 +213,16 @@ static gboolean
cal_backend_emit_timezone_added_idle_cb (gpointer user_data)
{
SignalClosure *signal_closure = user_data;
+ ECalBackend *backend;
- g_signal_emit_by_name (
- signal_closure->backend,
- "timezone-added",
- signal_closure->cached_zone);
+ backend = g_weak_ref_get (&signal_closure->backend);
+
+ if (backend != NULL) {
+ g_signal_emit_by_name (
+ backend, "timezone-added",
+ signal_closure->cached_zone);
+ g_object_unref (backend);
+ }
return FALSE;
}
@@ -425,7 +430,7 @@ cal_backend_add_cached_timezone (ETimezoneCache *cache,
* internally cached icaltimezone alive for the
* duration of the idle callback. */
signal_closure = g_slice_new0 (SignalClosure);
- signal_closure->backend = g_object_ref (cache);
+ g_weak_ref_set (&signal_closure->backend, cache);
signal_closure->cached_zone = cached_zone;
main_context = e_backend_ref_main_context (E_BACKEND (cache));
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]