[Telepathy-commits] [telepathy-gabble/master] GabblePrivateTubesFactory: disconnect from status-changed during cleanup, centralize cleanup code, and make it more robust against multiple calls
Simon McVittie
simon.mcvittie at collabora.co.uk
Thu Aug 21 06:12:56 PDT 2008
---
src/private-tubes-factory.c | 38 ++++++++++++++++++++++++--------------
1 files changed, 24 insertions(+), 14 deletions(-)
diff --git a/src/private-tubes-factory.c b/src/private-tubes-factory.c
index 7175b12..041c351 100644
--- a/src/private-tubes-factory.c
+++ b/src/private-tubes-factory.c
@@ -73,6 +73,7 @@ enum
struct _GabblePrivateTubesFactoryPrivate
{
GabbleConnection *conn;
+ gulong status_changed_id;
LmMessageHandler *msg_tube_cb;
GHashTable *channels;
@@ -138,10 +139,8 @@ gabble_private_tubes_factory_constructor (GType type,
lm_connection_register_message_handler (priv->conn->lmconn,
priv->msg_tube_cb, LM_MESSAGE_TYPE_MESSAGE, LM_HANDLER_PRIORITY_FIRST);
- /* conn is guaranteed to live longer than the factory, so this
- * never needs disconnecting */
- g_signal_connect (priv->conn, "status-changed",
- (GCallback) connection_status_changed_cb, obj);
+ self->priv->status_changed_id = g_signal_connect (self->priv->conn,
+ "status-changed", (GCallback) connection_status_changed_cb, obj);
return obj;
}
@@ -163,10 +162,6 @@ gabble_private_tubes_factory_dispose (GObject *object)
gabble_private_tubes_factory_close_all (fac);
g_assert (priv->channels == NULL);
- lm_connection_unregister_message_handler (priv->conn->lmconn,
- priv->msg_tube_cb, LM_MESSAGE_TYPE_MESSAGE);
- lm_message_handler_unref (priv->msg_tube_cb);
-
if (G_OBJECT_CLASS (gabble_private_tubes_factory_parent_class)->dispose)
G_OBJECT_CLASS (gabble_private_tubes_factory_parent_class)->dispose (
object);
@@ -338,16 +333,31 @@ gabble_private_tubes_factory_close_all (GabblePrivateTubesFactory *fac)
{
GabblePrivateTubesFactoryPrivate *priv =
GABBLE_PRIVATE_TUBES_FACTORY_GET_PRIVATE (fac);
- GHashTable *tmp;
DEBUG ("closing 1-1 tubes channels");
- if (priv->channels == NULL)
- return;
+ if (priv->status_changed_id != 0)
+ {
+ g_signal_handler_disconnect (priv->conn,
+ priv->status_changed_id);
+ priv->status_changed_id = 0;
+ }
- tmp = priv->channels;
- priv->channels = NULL;
- g_hash_table_destroy (tmp);
+ if (priv->msg_tube_cb != NULL)
+ {
+ lm_connection_unregister_message_handler (priv->conn->lmconn,
+ priv->msg_tube_cb, LM_MESSAGE_TYPE_MESSAGE);
+ lm_message_handler_unref (priv->msg_tube_cb);
+ priv->msg_tube_cb = NULL;
+ }
+
+ if (priv->channels != NULL)
+ {
+ GHashTable *tmp = priv->channels;
+
+ priv->channels = NULL;
+ g_hash_table_destroy (tmp);
+ }
}
struct _ForeachData
--
1.5.6.3
More information about the Telepathy-commits
mailing list