[telepathy-mission-control/master] McdAccount: Requests: make create_request less precarious by returning a ref

Simon McVittie simon.mcvittie at collabora.co.uk
Fri Apr 3 10:32:16 PDT 2009


Returning a ref borrowed from the status-changed signal connection
is technically also correct, because account_request_common() doesn't
currently give that signal a chance to occur - but it's less fragile
to have too many references.
---
 src/mcd-account-requests.c |   11 ++++++++++-
 1 files changed, 10 insertions(+), 1 deletions(-)

diff --git a/src/mcd-account-requests.c b/src/mcd-account-requests.c
index fb5af1a..bd7aba2 100644
--- a/src/mcd-account-requests.c
+++ b/src/mcd-account-requests.c
@@ -181,7 +181,10 @@ create_request (McdAccount *account, GHashTable *properties,
 
     /* we use connect_after, to make sure that other signals (such as
      * RemoveFailedRequest) are emitted before the Failed signal */
-    g_signal_connect_after (channel, "status-changed",
+    /* WARNING: on_channel_status_changed unrefs the McdChannel (!), so we
+     * give it an extra reference, so that we can return a ref from this
+     * function */
+    g_signal_connect_after (g_object_ref (channel), "status-changed",
                             G_CALLBACK (on_channel_status_changed), account);
 
     /* the callback releases this reference */
@@ -209,10 +212,12 @@ account_request_common (McdAccount *account, GHashTable *properties,
                               preferred_handler, use_existing, &error);
     if (error)
     {
+        g_assert (channel == NULL);
         dbus_g_method_return_error (context, error);
         g_error_free (error);
         return;
     }
+
     request_id = _mcd_channel_get_request_path (channel);
     DEBUG ("returning %s", request_id);
     if (use_existing)
@@ -224,6 +229,10 @@ account_request_common (McdAccount *account, GHashTable *properties,
 
     dispatcher = mcd_master_get_dispatcher (mcd_master_get_default ());
     _mcd_dispatcher_add_request (dispatcher, account, channel);
+
+    /* we still have a ref returned by create_request(), which is no longer
+     * necessary */
+    g_object_unref (channel);
 }
 
 static void
-- 
1.5.6.5




More information about the telepathy-commits mailing list