]> git.0d.be Git - empathy.git/commitdiff
Fix a crash caused by tp-glib emitting invalidated in dispose
authorSjoerd Simons <sjoerd.simons@collabora.co.uk>
Tue, 25 Aug 2009 10:10:27 +0000 (11:10 +0100)
committerSjoerd Simons <sjoerd.simons@collabora.co.uk>
Tue, 25 Aug 2009 10:38:51 +0000 (11:38 +0100)
When an TpProxy is disposed tp-glib emits the invalidated signal. This meant
that when EmpathyAccount disposed its TpConnection as a result of the account
manager saying the connection was gone, the invalidated signal was emitted. As
a result of which the TpConnection would get disposed again...

libempathy/empathy-account.c

index 091950880af024c9d6a07f7b0fbfb70443e464ac..39b5d0f08c616dd3cb953d1410c26ccc5a96c541 100644 (file)
@@ -608,15 +608,19 @@ static void
 empathy_account_free_connection (EmpathyAccount *account)
 {
   EmpathyAccountPriv *priv = GET_PRIV (account);
+  TpConnection *conn;
+
+  if (priv->connection == NULL)
+    return;
+
+  conn = priv->connection;
+  priv->connection = NULL;
 
   if (priv->connection_invalidated_id != 0)
-    g_signal_handler_disconnect (priv->connection,
-        priv->connection_invalidated_id);
+    g_signal_handler_disconnect (conn, priv->connection_invalidated_id);
   priv->connection_invalidated_id = 0;
 
-  if (priv->connection != NULL)
-    g_object_unref (priv->connection);
-  priv->connection = NULL;
+  g_object_unref (conn);
 }
 
 void
@@ -853,12 +857,7 @@ _empathy_account_connection_invalidated_cb (TpProxy *self,
 
   g_assert (priv->connection == TP_CONNECTION (self));
 
-  g_signal_handler_disconnect (priv->connection,
-    priv->connection_invalidated_id);
-  priv->connection_invalidated_id = 0;
-
-  g_object_unref (priv->connection);
-  priv->connection = NULL;
+  empathy_account_free_connection (account);
 
   g_object_notify (G_OBJECT (account), "connection");
 }
@@ -878,15 +877,7 @@ _empathy_account_set_connection (EmpathyAccount *account,
         return;
     }
 
-  if (priv->connection != NULL)
-    {
-      g_signal_handler_disconnect (priv->connection,
-        priv->connection_invalidated_id);
-      priv->connection_invalidated_id = 0;
-
-      g_object_unref (priv->connection);
-      priv->connection = NULL;
-    }
+  empathy_account_free_connection (account);
 
   if (tp_strdiff ("/", path))
     {