summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRay Strode <rstrode@redhat.com>2014-03-17 23:47:16 -0400
committerRay Strode <rstrode@redhat.com>2014-03-18 00:06:05 -0400
commita9367393441b6e9026cb28778f81ec91f95f078d (patch)
treed165d1f5b94dd275f48081e1fb21ca8b6c1bca29
parent72ccb27377886b9998ad8b5b7a3b3070474f90f3 (diff)
downloadgdm-a9367393441b6e9026cb28778f81ec91f95f078d.tar.gz
server: maintain active_servers list through explicit weak references
It's possible for the server object to get freed before its child watch fires (if the slave is stopped early), so we can't rely on the child watch to main accounting on the active servers list. This commit changes the code over to use weak references instead.
-rw-r--r--daemon/gdm-server.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/daemon/gdm-server.c b/daemon/gdm-server.c
index d4ee8530..ccb26a34 100644
--- a/daemon/gdm-server.c
+++ b/daemon/gdm-server.c
@@ -703,14 +703,18 @@ server_child_watch (GPid pid,
g_signal_emit (server, signals [DIED], 0, num);
}
- active_servers = g_slist_remove (active_servers, server);
-
g_spawn_close_pid (server->priv->pid);
server->priv->pid = -1;
g_object_unref (server);
}
+static void
+prune_active_servers_list (GdmServer *server)
+{
+ active_servers = g_slist_remove (active_servers, server);
+}
+
static gboolean
gdm_server_spawn (GdmServer *server,
const char *vtarg,
@@ -750,6 +754,11 @@ gdm_server_spawn (GdmServer *server,
active_servers = g_slist_append (active_servers, server);
+ g_object_weak_ref (G_OBJECT (server),
+ (GWeakNotify)
+ prune_active_servers_list,
+ server);
+
gdm_server_launch_sigusr1_thread_if_needed ();
if (!g_spawn_async_with_pipes (NULL,