diff options
author | Ray Strode <rstrode@redhat.com> | 2014-03-17 23:47:16 -0400 |
---|---|---|
committer | Ray Strode <rstrode@redhat.com> | 2014-03-18 00:06:05 -0400 |
commit | a9367393441b6e9026cb28778f81ec91f95f078d (patch) | |
tree | d165d1f5b94dd275f48081e1fb21ca8b6c1bca29 | |
parent | 72ccb27377886b9998ad8b5b7a3b3070474f90f3 (diff) | |
download | gdm-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.c | 13 |
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, |