[gdm] session: make sure worker manager interface is freed up
- From: Ray Strode <halfline src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gdm] session: make sure worker manager interface is freed up
- Date: Thu, 21 Aug 2014 14:15:51 +0000 (UTC)
commit b0791a82f87796e070069375725ff12d11c927bb
Author: Ray Strode <rstrode redhat com>
Date: Wed Aug 20 09:31:49 2014 -0400
session: make sure worker manager interface is freed up
Right now we unref the worker manager interface in one function:
stop_conversation_now
We neglect to unref it in stop_conversation and, of course, it's
owned by the conversation object so it should get freed when the
conversation is freed.
This commit changes the stop functions to deactivate the interface
in stop, changes the free function to drop the reference to the interface.
https://bugzilla.gnome.org/show_bug.cgi?id=727589
daemon/gdm-session.c | 37 ++++++++++++++++++++++++++++++++++++-
1 files changed, 36 insertions(+), 1 deletions(-)
---
diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c
index f40a057..74bb457 100644
--- a/daemon/gdm-session.c
+++ b/daemon/gdm-session.c
@@ -1148,6 +1148,30 @@ export_worker_manager_interface (GdmSession *self,
NULL);
}
+static void
+unexport_worker_manager_interface (GdmSession *self,
+ GdmDBusWorkerManager *worker_manager_interface)
+{
+
+ g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (worker_manager_interface));
+
+ g_signal_handlers_disconnect_by_func (worker_manager_interface,
+ G_CALLBACK (register_worker),
+ self);
+ g_signal_handlers_disconnect_by_func (worker_manager_interface,
+ G_CALLBACK (gdm_session_handle_info_query),
+ self);
+ g_signal_handlers_disconnect_by_func (worker_manager_interface,
+ G_CALLBACK (gdm_session_handle_secret_info_query),
+ self);
+ g_signal_handlers_disconnect_by_func (worker_manager_interface,
+ G_CALLBACK (gdm_session_handle_info),
+ self);
+ g_signal_handlers_disconnect_by_func (worker_manager_interface,
+ G_CALLBACK (gdm_session_handle_problem),
+ self);
+}
+
static gboolean
handle_connection_from_worker (GDBusServer *server,
GDBusConnection *connection,
@@ -1674,6 +1698,7 @@ free_conversation (GdmSessionConversation *conversation)
g_free (conversation->service_name);
g_free (conversation->starting_username);
g_free (conversation->session_id);
+ g_clear_object (&conversation->worker_manager_interface);
g_clear_object (&conversation->worker_proxy);
g_clear_object (&conversation->session);
g_free (conversation);
@@ -1842,6 +1867,12 @@ start_conversation (GdmSession *self,
static void
stop_conversation (GdmSessionConversation *conversation)
{
+ GdmSession *self = conversation->session;
+
+ if (conversation->worker_manager_interface != NULL) {
+ unexport_worker_manager_interface (self, conversation->worker_manager_interface);
+ }
+
if (conversation->worker_proxy != NULL) {
GDBusConnection *connection = g_dbus_proxy_get_connection (G_DBUS_PROXY
(conversation->worker_proxy));
g_dbus_connection_close_sync (connection, NULL, NULL);
@@ -1854,7 +1885,11 @@ stop_conversation (GdmSessionConversation *conversation)
static void
stop_conversation_now (GdmSessionConversation *conversation)
{
- g_clear_object (&conversation->worker_manager_interface);
+ GdmSession *self = conversation->session;
+
+ if (conversation->worker_manager_interface != NULL) {
+ unexport_worker_manager_interface (self, conversation->worker_manager_interface);
+ }
if (conversation->worker_proxy != NULL) {
GDBusConnection *connection = g_dbus_proxy_get_connection (G_DBUS_PROXY
(conversation->worker_proxy));
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]