From 3702cb89aa2fe19bea22e280b55fc71e677e9568 Mon Sep 17 00:00:00 2001 From: Sjoerd Simons Date: Tue, 25 Aug 2009 11:10:27 +0100 Subject: Fix a crash caused by tp-glib emitting invalidated in dispose 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 | 31 +++++++++++-------------------- 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/libempathy/empathy-account.c b/libempathy/empathy-account.c index 091950880..39b5d0f08 100644 --- a/libempathy/empathy-account.c +++ b/libempathy/empathy-account.c @@ -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)) { -- cgit v1.2.3