[telepathy-mission-control/master] McdHandlerMap: watch for crashed handlers internally, rather than relying on McdDispatcher
Simon McVittie
simon.mcvittie at collabora.co.uk
Mon Oct 19 07:01:13 PDT 2009
This means that MC's only global NameOwnerChanged watch is the one in
McdClientRegistry, which watches for new Client bus names - as soon as
dbus-daemon supports arg0prefix, that watch can reduce in scope to a watch
for Telepathy clients.
---
src/mcd-dispatcher.c | 27 ---------------------
src/mcd-handler-map-priv.h | 3 --
src/mcd-handler-map.c | 56 ++++++++++++++++++++++++++++++++++++++-----
3 files changed, 49 insertions(+), 37 deletions(-)
diff --git a/src/mcd-dispatcher.c b/src/mcd-dispatcher.c
index 161969e..bce0747 100644
--- a/src/mcd-dispatcher.c
+++ b/src/mcd-dispatcher.c
@@ -1872,30 +1872,6 @@ mcd_dispatcher_update_client_caps (McdDispatcher *self,
}
static void
-name_owner_changed_cb (TpDBusDaemon *proxy,
- const gchar *name,
- const gchar *old_owner,
- const gchar *new_owner,
- gpointer user_data,
- GObject *weak_object)
-{
- McdDispatcher *self = MCD_DISPATCHER (weak_object);
- McdDispatcherPrivate *priv = MCD_DISPATCHER_PRIV (self);
-
- /* dbus-glib guarantees this */
- g_assert (name != NULL);
- g_assert (old_owner != NULL);
- g_assert (new_owner != NULL);
-
- if (name[0] == ':' && new_owner[0] == '\0')
- {
- /* A unique name disappeared from the bus. It might be handling
- * channels? */
- _mcd_handler_map_set_handler_crashed (priv->handler_map, name);
- }
-}
-
-static void
mcd_dispatcher_constructed (GObject *object)
{
DBusGConnection *dgc;
@@ -1911,9 +1887,6 @@ mcd_dispatcher_constructed (GObject *object)
G_CALLBACK (mcd_dispatcher_client_registry_ready_cb),
object);
- tp_cli_dbus_daemon_connect_to_name_owner_changed (priv->dbus_daemon,
- name_owner_changed_cb, NULL, NULL, object, NULL);
-
dgc = TP_PROXY (priv->dbus_daemon)->dbus_connection;
if (!tp_dbus_daemon_request_name (priv->dbus_daemon,
diff --git a/src/mcd-handler-map-priv.h b/src/mcd-handler-map-priv.h
index aa7d1f5..e3d0f24 100644
--- a/src/mcd-handler-map-priv.h
+++ b/src/mcd-handler-map-priv.h
@@ -78,9 +78,6 @@ void _mcd_handler_map_set_channel_handled (McdHandlerMap *self,
McdChannel *channel,
const gchar *unique_name);
-void _mcd_handler_map_set_handler_crashed (McdHandlerMap *self,
- const gchar *unique_name);
-
G_END_DECLS
#endif
diff --git a/src/mcd-handler-map.c b/src/mcd-handler-map.c
index fec75be..5ee6e44 100644
--- a/src/mcd-handler-map.c
+++ b/src/mcd-handler-map.c
@@ -33,6 +33,7 @@ G_DEFINE_TYPE (McdHandlerMap, _mcd_handler_map, G_TYPE_OBJECT);
struct _McdHandlerMapPrivate
{
+ TpDBusDaemon *dbus_daemon;
/* The handler for each channel currently being handled
* owned gchar *object_path => owned gchar *unique_name */
GHashTable *channel_processes;
@@ -114,6 +115,11 @@ _mcd_handler_map_set_property (GObject *object,
}
}
+static void mcd_handler_map_name_owner_cb (TpDBusDaemon *dbus_daemon,
+ const gchar *name,
+ const gchar *new_owner,
+ gpointer user_data);
+
static void
_mcd_handler_map_dispose (GObject *object)
{
@@ -125,6 +131,25 @@ _mcd_handler_map_dispose (GObject *object)
self->priv->handled_channels = NULL;
}
+ if (self->priv->handler_processes != NULL)
+ {
+ GHashTableIter iter;
+ gpointer k;
+
+ g_assert (self->priv->dbus_daemon != NULL);
+
+ g_hash_table_iter_init (&iter, self->priv->handler_processes);
+
+ while (g_hash_table_iter_next (&iter, &k, NULL))
+ {
+ tp_dbus_daemon_cancel_name_owner_watch (self->priv->dbus_daemon,
+ k, mcd_handler_map_name_owner_cb, object);
+ }
+
+ g_hash_table_destroy (self->priv->handler_processes);
+ self->priv->handler_processes = NULL;
+ }
+
if (self->priv->dbus_daemon != NULL)
{
g_object_unref (self->priv->dbus_daemon);
@@ -145,12 +170,6 @@ _mcd_handler_map_finalize (GObject *object)
self->priv->channel_processes = NULL;
}
- if (self->priv->handler_processes != NULL)
- {
- g_hash_table_destroy (self->priv->handler_processes);
- self->priv->handler_processes = NULL;
- }
-
G_OBJECT_CLASS (_mcd_handler_map_parent_class)->finalize (object);
}
@@ -161,6 +180,8 @@ _mcd_handler_map_class_init (McdHandlerMapClass *klass)
g_type_class_add_private (object_class, sizeof (McdHandlerMapPrivate));
object_class->dispose = _mcd_handler_map_dispose;
+ object_class->get_property = _mcd_handler_map_get_property;
+ object_class->set_property = _mcd_handler_map_set_property;
object_class->finalize = _mcd_handler_map_finalize;
g_object_class_install_property (object_class, PROP_DBUS_DAEMON,
@@ -208,6 +229,8 @@ _mcd_handler_map_set_path_handled (McdHandlerMap *self,
if (--*counter == 0)
{
+ tp_dbus_daemon_cancel_name_owner_watch (self->priv->dbus_daemon,
+ old, mcd_handler_map_name_owner_cb, self);
g_hash_table_remove (self->priv->handler_processes, old);
}
}
@@ -224,6 +247,9 @@ _mcd_handler_map_set_path_handled (McdHandlerMap *self,
*counter = 1;
g_hash_table_insert (self->priv->handler_processes,
g_strdup (unique_name), counter);
+ tp_dbus_daemon_watch_name_owner (self->priv->dbus_daemon, unique_name,
+ mcd_handler_map_name_owner_cb, self,
+ NULL);
}
else
{
@@ -283,7 +309,7 @@ _mcd_handler_map_set_channel_handled (McdHandlerMap *self,
_mcd_handler_map_set_path_handled (self, path, unique_name);
}
-void
+static void
_mcd_handler_map_set_handler_crashed (McdHandlerMap *self,
const gchar *unique_name)
{
@@ -296,6 +322,10 @@ _mcd_handler_map_set_handler_crashed (McdHandlerMap *self,
gpointer path_p, name_p;
GList *paths = NULL;
+ tp_dbus_daemon_cancel_name_owner_watch (self->priv->dbus_daemon,
+ unique_name,
+ mcd_handler_map_name_owner_cb,
+ self);
g_hash_table_remove (self->priv->handler_processes, unique_name);
/* This is O(number of channels being handled) but then again
@@ -335,3 +365,15 @@ _mcd_handler_map_set_handler_crashed (McdHandlerMap *self,
}
}
}
+
+static void
+mcd_handler_map_name_owner_cb (TpDBusDaemon *dbus_daemon,
+ const gchar *name,
+ const gchar *new_owner,
+ gpointer user_data)
+{
+ if (new_owner == NULL || new_owner[0] == '\0')
+ {
+ _mcd_handler_map_set_handler_crashed (user_data, name);
+ }
+}
--
1.5.6.5
More information about the telepathy-commits
mailing list