[evolution-data-server] Add e_weak_ref_new() and e_weak_ref_free().



commit 28dfb63bdb855c37e68b71356aec291770b83dd0
Author: Matthew Barnes <mbarnes redhat com>
Date:   Sat Mar 16 10:41:13 2013 -0400

    Add e_weak_ref_new() and e_weak_ref_free().
    
    This has come up enough times now that it's worth adding public API.

 addressbook/libebook/e-book-client.c               |   15 +------
 calendar/libecal/e-cal-client.c                    |   15 +------
 .../libedataserver/libedataserver-sections.txt     |    2 +
 libebackend/e-data-factory.c                       |   19 +--------
 libedataserver/e-data-server-util.c                |   40 ++++++++++++++++++++
 libedataserver/e-data-server-util.h                |    2 +
 6 files changed, 50 insertions(+), 43 deletions(-)
---
diff --git a/addressbook/libebook/e-book-client.c b/addressbook/libebook/e-book-client.c
index b0baea5..fc93f85 100644
--- a/addressbook/libebook/e-book-client.c
+++ b/addressbook/libebook/e-book-client.c
@@ -162,13 +162,6 @@ run_in_thread_closure_free (RunInThreadClosure *run_in_thread_closure)
        g_slice_free (RunInThreadClosure, run_in_thread_closure);
 }
 
-static void
-weak_ref_free (GWeakRef *weak_ref)
-{
-       g_weak_ref_set (weak_ref, NULL);
-       g_slice_free (GWeakRef, weak_ref);
-}
-
 /*
  * Well-known book backend properties:
  * @BOOK_BACKEND_PROPERTY_REQUIRED_FIELDS: Retrieves comma-separated list
@@ -717,7 +710,6 @@ book_client_init_in_dbus_thread (GSimpleAsyncResult *simple,
        EDBusAddressBookFactory *factory_proxy;
        GDBusConnection *connection;
        GDBusProxy *proxy;
-       GWeakRef *weak_ref;
        EClient *client;
        ESource *source;
        const gchar *uid;
@@ -802,17 +794,14 @@ book_client_init_in_dbus_thread (GSimpleAsyncResult *simple,
 
        g_dbus_proxy_set_default_timeout (proxy, DBUS_PROXY_TIMEOUT_MS);
 
-       /* XXX Wishing for g_weak_ref_new() / g_weak_ref_free() here. */
-       weak_ref = g_slice_new0 (GWeakRef);
-       g_weak_ref_set (weak_ref, client);
-
        priv->name_watcher_id = g_bus_watch_name_on_connection (
                connection,
                g_dbus_proxy_get_name (proxy),
                G_BUS_NAME_WATCHER_FLAGS_NONE,
                (GBusNameAppearedCallback) NULL,
                (GBusNameVanishedCallback) book_client_name_vanished_cb,
-               weak_ref, (GDestroyNotify) weak_ref_free);
+               e_weak_ref_new (client),
+               (GDestroyNotify) e_weak_ref_free);
 
        handler_id = g_signal_connect_object (
                proxy, "error",
diff --git a/calendar/libecal/e-cal-client.c b/calendar/libecal/e-cal-client.c
index 1ef0ad5..5f25db0 100644
--- a/calendar/libecal/e-cal-client.c
+++ b/calendar/libecal/e-cal-client.c
@@ -217,13 +217,6 @@ run_in_thread_closure_free (RunInThreadClosure *run_in_thread_closure)
 }
 
 static void
-weak_ref_free (GWeakRef *weak_ref)
-{
-       g_weak_ref_set (weak_ref, NULL);
-       g_slice_free (GWeakRef, weak_ref);
-}
-
-static void
 free_zone_cb (gpointer zone)
 {
        icaltimezone_free (zone, 1);
@@ -994,7 +987,6 @@ cal_client_init_in_dbus_thread (GSimpleAsyncResult *simple,
        EDBusCalendarFactory *factory_proxy;
        GDBusConnection *connection;
        GDBusProxy *proxy;
-       GWeakRef *weak_ref;
        EClient *client;
        ESource *source;
        const gchar *uid;
@@ -1096,17 +1088,14 @@ cal_client_init_in_dbus_thread (GSimpleAsyncResult *simple,
 
        g_dbus_proxy_set_default_timeout (proxy, DBUS_PROXY_TIMEOUT_MS);
 
-       /* XXX Wishing for g_weak_ref_new() / g_weak_ref_free() here. */
-       weak_ref = g_slice_new0 (GWeakRef);
-       g_weak_ref_set (weak_ref, client);
-
        priv->name_watcher_id = g_bus_watch_name_on_connection (
                connection,
                g_dbus_proxy_get_name (proxy),
                G_BUS_NAME_WATCHER_FLAGS_NONE,
                (GBusNameAppearedCallback) NULL,
                (GBusNameVanishedCallback) cal_client_name_vanished_cb,
-               weak_ref, (GDestroyNotify) weak_ref_free);
+               e_weak_ref_new (client),
+               (GDestroyNotify) e_weak_ref_free);
 
        handler_id = g_signal_connect_object (
                proxy, "error",
diff --git a/docs/reference/libedataserver/libedataserver-sections.txt 
b/docs/reference/libedataserver/libedataserver-sections.txt
index f29ae98..71e04c5 100644
--- a/docs/reference/libedataserver/libedataserver-sections.txt
+++ b/docs/reference/libedataserver/libedataserver-sections.txt
@@ -1221,6 +1221,8 @@ e_util_slist_to_strv
 e_util_strv_to_slist
 e_util_free_nullable_object_slist
 e_queue_transfer
+e_weak_ref_new
+e_weak_ref_free
 e_file_recursive_delete_sync
 e_file_recursive_delete
 e_file_recursive_delete_finish
diff --git a/libebackend/e-data-factory.c b/libebackend/e-data-factory.c
index 4f1c92e..00f8e16 100644
--- a/libebackend/e-data-factory.c
+++ b/libebackend/e-data-factory.c
@@ -59,21 +59,6 @@ G_DEFINE_ABSTRACT_TYPE (
        EDataFactory, e_data_factory, E_TYPE_DBUS_SERVER)
 
 static GWeakRef *
-data_factory_weak_ref_new (void)
-{
-       /* A GWeakRef allocated in zero-filled memory is sufficiently
-        * initialized without calling g_weak_ref_init(weak_ref, NULL). */
-       return g_slice_new0 (GWeakRef);
-}
-
-static void
-data_factory_weak_ref_free (GWeakRef *weak_ref)
-{
-       g_weak_ref_clear (weak_ref);
-       g_slice_free (GWeakRef, weak_ref);
-}
-
-static GWeakRef *
 data_factory_backends_lookup (EDataFactory *data_factory,
                               const gchar *uid)
 {
@@ -84,7 +69,7 @@ data_factory_backends_lookup (EDataFactory *data_factory,
        weak_ref = g_hash_table_lookup (backends, uid);
 
        if (weak_ref == NULL) {
-               weak_ref = data_factory_weak_ref_new ();
+               weak_ref = e_weak_ref_new (NULL);
                g_hash_table_insert (backends, g_strdup (uid), weak_ref);
        }
 
@@ -207,7 +192,7 @@ e_data_factory_init (EDataFactory *data_factory)
                (GHashFunc) g_str_hash,
                (GEqualFunc) g_str_equal,
                (GDestroyNotify) g_free,
-               (GDestroyNotify) data_factory_weak_ref_free);
+               (GDestroyNotify) e_weak_ref_free);
 
        data_factory->priv->backend_factories = g_hash_table_new_full (
                (GHashFunc) g_str_hash,
diff --git a/libedataserver/e-data-server-util.c b/libedataserver/e-data-server-util.c
index 03f07d9..48640c3 100644
--- a/libedataserver/e-data-server-util.c
+++ b/libedataserver/e-data-server-util.c
@@ -1068,6 +1068,46 @@ e_queue_transfer (GQueue *src_queue,
        src_queue->length = 0;
 }
 
+/**
+ * e_weak_ref_new:
+ * @object: (allow-none): a #GObject or %NULL
+ *
+ * Allocates a new #GWeakRef and calls g_weak_ref_set() with @object.
+ *
+ * Free the returned #GWeakRef with e_weak_ref_free().
+ *
+ * Returns: a new #GWeakRef
+ *
+ * Since: 3.10
+ **/
+GWeakRef *
+e_weak_ref_new (gpointer object)
+{
+       GWeakRef *weak_ref;
+
+       weak_ref = g_slice_new0 (GWeakRef);
+       g_weak_ref_set (weak_ref, object);
+
+       return weak_ref;
+}
+
+/**
+ * e_weak_ref_free:
+ * @weak_ref: a #GWeakRef
+ *
+ * Frees a #GWeakRef created by e_weak_ref_new().
+ *
+ * Since: 3.10
+ **/
+void
+e_weak_ref_free (GWeakRef *weak_ref)
+{
+       g_return_if_fail (weak_ref != NULL);
+
+       g_weak_ref_set (weak_ref, NULL);
+       g_slice_free (GWeakRef, weak_ref);
+}
+
 /* Helper for e_file_recursive_delete() */
 static void
 file_recursive_delete_thread (GSimpleAsyncResult *simple,
diff --git a/libedataserver/e-data-server-util.h b/libedataserver/e-data-server-util.h
index cf8ce2d..dee9bc7 100644
--- a/libedataserver/e-data-server-util.h
+++ b/libedataserver/e-data-server-util.h
@@ -77,6 +77,8 @@ void          e_util_free_nullable_object_slist
                                                (GSList *objects);
 void           e_queue_transfer                (GQueue *src_queue,
                                                 GQueue *dst_queue);
+GWeakRef *     e_weak_ref_new                  (gpointer object);
+void           e_weak_ref_free                 (GWeakRef *weak_ref);
 
 gboolean       e_file_recursive_delete_sync    (GFile *file,
                                                 GCancellable *cancellable,


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