[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