[Telepathy-commits] [telepathy-salut/master] SalutDirectBytestreamManager: free listeners automatically by registering a function in g_hash_table_new_full and using g_hash_table_remove
Alban Crequy
alban.crequy at collabora.co.uk
Tue Nov 25 03:59:29 PST 2008
---
src/salut-direct-bytestream-manager.c | 38 +++++++++++++++++++-------------
1 files changed, 22 insertions(+), 16 deletions(-)
diff --git a/src/salut-direct-bytestream-manager.c b/src/salut-direct-bytestream-manager.c
index ab7b44a..f98ac68 100644
--- a/src/salut-direct-bytestream-manager.c
+++ b/src/salut-direct-bytestream-manager.c
@@ -87,6 +87,26 @@ struct _SalutDirectBytestreamManagerListener
#define SALUT_DIRECT_BYTESTREAM_MANAGER_GET_PRIVATE(obj) \
((SalutDirectBytestreamManagerPrivate *) ((SalutDirectBytestreamManager *)obj)->priv)
+void
+listener_free (gpointer data)
+{
+ SalutDirectBytestreamManagerListener *listener = data;
+
+ g_assert (listener != NULL);
+
+ if (listener->listen_io_channel_source_id != 0)
+ {
+ GSource* source = g_main_context_find_source_by_id (NULL,
+ listener->listen_io_channel_source_id);
+ g_assert (source != NULL);
+ g_source_destroy (source);
+ listener->listen_io_channel_source_id = 0;
+ }
+
+ g_slice_free (struct _listener_io_in_cb_data, listener->data);
+ g_slice_free (SalutDirectBytestreamManagerListener, listener);
+}
+
static void
salut_direct_bytestream_manager_init (SalutDirectBytestreamManager *self)
{
@@ -191,7 +211,7 @@ salut_direct_bytestream_manager_constructor (GType type,
g_assert (priv->im_manager != NULL);
g_assert (priv->xmpp_connection_manager != NULL);
- priv->listeners = g_hash_table_new (NULL, NULL);
+ priv->listeners = g_hash_table_new_full (NULL, NULL, NULL, listener_free);
return obj;
}
@@ -458,24 +478,10 @@ void salut_direct_bytestream_manager_stop_listen (
SalutDirectBytestreamManager *self, gpointer id)
{
SalutDirectBytestreamManagerPrivate *priv;
- SalutDirectBytestreamManagerListener *listener;
priv = SALUT_DIRECT_BYTESTREAM_MANAGER_GET_PRIVATE (self);
- listener = g_hash_table_lookup (priv->listeners, id);
- g_assert (listener != NULL);
-
- if (listener->listen_io_channel_source_id != 0)
- {
- GSource* source = g_main_context_find_source_by_id (NULL,
- listener->listen_io_channel_source_id);
- g_assert (source != NULL);
- g_source_destroy (source);
- listener->listen_io_channel_source_id = 0;
- }
-
- g_slice_free (struct _listener_io_in_cb_data, listener->data);
- g_slice_free (SalutDirectBytestreamManagerListener, listener);
+ g_hash_table_remove (priv->listeners, id);
}
GibberBytestreamIface *
--
1.5.6.5
More information about the Telepathy-commits
mailing list