[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