[Xfce4-commits] [xfce/xfce4-session] 04/11: Track dbus clients by service name

noreply at xfce.org noreply at xfce.org
Tue Jun 28 09:26:07 CEST 2016


This is an automated email from the git hooks/post-receive script.

eric pushed a commit to branch master
in repository xfce/xfce4-session.

commit 20fe895899854512b39cba39f0c14ddcafba6976
Author: Eric Koegel <eric.koegel at gmail.com>
Date:   Mon Jun 20 11:15:15 2016 +0300

    Track dbus clients by service name
    
    This way we will know when they terminate and we can remove them
    from the client list.
---
 .gitignore                      |  1 +
 xfce4-session/xfsm-client.c     | 20 +++++++++
 xfce4-session/xfsm-client.h     |  5 +++
 xfce4-session/xfsm-manager.c    | 91 ++++++++++++++++++++++++++++++++++++++++-
 xfce4-session/xfsm-properties.h |  1 +
 5 files changed, 116 insertions(+), 2 deletions(-)

diff --git a/.gitignore b/.gitignore
index 365f4fa..d332f2d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -57,6 +57,7 @@ settings/xfsm-client-dbus-client.h
 settings/xfsm-manager-dbus-client.h
 settings/xfsm-client-dbus-client.c
 settings/xfsm-manager-dbus-client.c
+settings/xfce4-session-settings.ui~
 stamp-h1
 xfce.desktop
 xfce4-session-logout/xfce4-session-logout
diff --git a/xfce4-session/xfsm-client.c b/xfce4-session/xfsm-client.c
index aad20d1..2f93f93 100644
--- a/xfce4-session/xfsm-client.c
+++ b/xfce4-session/xfsm-client.c
@@ -49,6 +49,7 @@ struct _XfsmClient
 
   gchar           *id;
   gchar           *object_path;
+  gchar           *service_name;
 
   XfsmClientState  state;
   XfsmProperties  *properties;
@@ -112,6 +113,7 @@ xfsm_client_finalize (GObject *obj)
 
   g_free (client->id);
   g_free (client->object_path);
+  g_free (client->service_name);
 
   G_OBJECT_CLASS (xfsm_client_parent_class)->finalize (obj);
 }
@@ -358,6 +360,24 @@ xfsm_client_get_object_path (XfsmClient *client)
 
 
 
+
+void
+xfsm_client_set_service_name (XfsmClient *client,
+                              const gchar *service_name)
+{
+  g_free (client->service_name);
+  client->service_name = g_strdup (service_name);
+}
+
+
+const gchar*
+xfsm_client_get_service_name (XfsmClient *client)
+{
+  return client->service_name;
+}
+
+
+
 void
 xfsm_client_set_pid (XfsmClient *client,
                      pid_t       pid)
diff --git a/xfce4-session/xfsm-client.h b/xfce4-session/xfsm-client.h
index 7685300..9388466 100644
--- a/xfce4-session/xfsm-client.h
+++ b/xfce4-session/xfsm-client.h
@@ -82,6 +82,11 @@ const gchar *xfsm_client_get_object_path (XfsmClient *client);
 void xfsm_client_set_pid (XfsmClient *client,
                           pid_t       pid);
 
+void         xfsm_client_set_service_name (XfsmClient *client,
+                                           const gchar *service_name);
+const gchar *xfsm_client_get_service_name (XfsmClient *client);
+
+
 G_END_DECLS
 
 #endif /* !__XFSM_CLIENT_H__ */
diff --git a/xfce4-session/xfsm-manager.c b/xfce4-session/xfsm-manager.c
index 864d720..227aa5a 100644
--- a/xfce4-session/xfsm-manager.c
+++ b/xfce4-session/xfsm-manager.c
@@ -120,6 +120,7 @@ struct _XfsmManager
   GQueue          *failsafe_clients;
 
   guint            die_timeout_id;
+  guint            name_owner_id;
 
   GDBusConnection *connection;
 };
@@ -1921,6 +1922,45 @@ static gboolean xfsm_manager_dbus_unregister_client (XfsmDbusManager *object,
 
 
 static void
+remove_clients_for_connection (XfsmManager *manager,
+                               const gchar *service_name)
+{
+  GList       *lp;
+
+  for (lp = g_queue_peek_nth_link (manager->running_clients, 0);
+       lp;
+       lp = lp->next)
+    {
+      XfsmClient *client = XFSM_CLIENT (lp->data);
+      if (g_strcmp0 (xfsm_client_get_service_name (client), service_name) == 0)
+        {
+          xfsm_manager_close_connection (manager, client, FALSE);
+        }
+    }
+}
+
+static void
+on_name_owner_notify (GDBusConnection *connection,
+                      const gchar     *sender_name,
+                      const gchar     *object_path,
+                      const gchar     *interface_name,
+                      const gchar     *signal_name,
+                      GVariant        *parameters,
+                      gpointer         user_data)
+{
+        XfsmManager *manager = XFSM_MANAGER (user_data);
+        gchar       *service_name,
+                    *old_service_name,
+                    *new_service_name;
+
+        g_variant_get (parameters, "(sss)", &service_name, &old_service_name, &new_service_name);
+
+        if (strlen (new_service_name) == 0) {
+                remove_clients_for_connection (manager, old_service_name);
+        }
+}
+
+static void
 xfsm_manager_dbus_class_init (XfsmManagerClass *klass)
 {
 }
@@ -1949,6 +1989,17 @@ xfsm_manager_dbus_init (XfsmManager *manager, GDBusConnection *connection)
   }
 
   g_debug ("exported on %s", g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (XFSM_DBUS_MANAGER (manager))));
+
+  manager->name_owner_id = g_dbus_connection_signal_subscribe (manager->connection,
+                                                               "org.freedesktop.DBus",
+                                                               "org.freedesktop.DBus",
+                                                               "NameOwnerChanged",
+                                                               "/org/freedesktop/DBus",
+                                                               NULL,
+                                                               G_DBUS_SIGNAL_FLAGS_NONE,
+                                                               on_name_owner_notify,
+                                                               manager,
+                                                               NULL);
 }
 
 
@@ -1975,6 +2026,12 @@ xfsm_manager_iface_init (XfsmDbusManagerIface *iface)
 static void
 xfsm_manager_dbus_cleanup (XfsmManager *manager)
 {
+  if (manager->name_owner_id > 0 && manager->connection)
+    {
+      g_dbus_connection_signal_unsubscribe (manager->connection, manager->name_owner_id);
+      manager->name_owner_id = 0;
+    }
+
   if (G_LIKELY (manager->connection))
     {
       g_object_unref (manager->connection);
@@ -2302,6 +2359,8 @@ xfsm_manager_dbus_can_hibernate (XfsmDbusManager *object,
   return TRUE;
 }
 
+
+
 /* adapted from ConsoleKit2 whch was adapted from PolicyKit */
 static gboolean
 get_caller_info (XfsmManager *manager,
@@ -2348,6 +2407,8 @@ out:
         return res;
 }
 
+
+
 static gboolean
 xfsm_manager_dbus_register_client (XfsmDbusManager *object,
                                    GDBusMethodInvocation *invocation,
@@ -2376,7 +2437,7 @@ xfsm_manager_dbus_register_client (XfsmDbusManager *object,
   /* register it so that it exports the dbus name */
   xfsm_manager_register_client (manager, client, client_id, NULL);
 
-  /* attempt to get the caller'd pid so we can monitor it */
+  /* attempt to get the caller'd pid */
   if (!get_caller_info (manager, g_dbus_method_invocation_get_sender (invocation), &pid))
     {
       pid = 0;
@@ -2384,16 +2445,42 @@ xfsm_manager_dbus_register_client (XfsmDbusManager *object,
 
   xfsm_client_set_pid (client, pid);
 
+  /* we use the dbus service name to track clients so we know when they exit
+   * or crash */
+  xfsm_client_set_service_name (client, g_dbus_method_invocation_get_sender (invocation));
+
   xfsm_dbus_manager_complete_register_client (object, invocation, xfsm_client_get_object_path (client));
   g_free (client_id);
   return TRUE;
 }
 
+
+
 static gboolean
 xfsm_manager_dbus_unregister_client (XfsmDbusManager *object,
                                      GDBusMethodInvocation *invocation,
                                      const gchar *arg_client_id)
 {
-  xfsm_dbus_manager_complete_unregister_client (object, invocation);
+  XfsmManager *manager;
+  GList       *lp;
+
+  manager = XFSM_MANAGER (object);
+
+
+  for (lp = g_queue_peek_nth_link (manager->running_clients, 0);
+       lp;
+       lp = lp->next)
+    {
+      XfsmClient *client = XFSM_CLIENT (lp->data);
+      if (g_strcmp0 (xfsm_client_get_object_path (client), arg_client_id) == 0)
+        {
+          xfsm_manager_close_connection (manager, client, FALSE);
+          xfsm_dbus_manager_complete_unregister_client (object, invocation);
+          return TRUE;
+        }
+    }
+
+
+  throw_error (invocation, XFSM_ERROR_BAD_VALUE, "Client with id of '%s' was not found", arg_client_id);
   return TRUE;
 }
diff --git a/xfce4-session/xfsm-properties.h b/xfce4-session/xfsm-properties.h
index 6fe00e7..e31bd95 100644
--- a/xfce4-session/xfsm-properties.h
+++ b/xfce4-session/xfsm-properties.h
@@ -46,6 +46,7 @@ struct _XfsmProperties
 
   gchar  *client_id;
   gchar  *hostname;
+  gchar  *service_name;
 
   GTree  *sm_properties;
 };

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Xfce4-commits mailing list