Blame SOURCES/0001-daemon-Don-t-error-on-shutdown.patch

29f921
From fbdb5fdfc5f4c5569643239cae1d6fe5fac13717 Mon Sep 17 00:00:00 2001
29f921
From: Ray Strode <rstrode@redhat.com>
29f921
Date: Mon, 12 Dec 2022 10:52:58 -0500
29f921
Subject: [PATCH] daemon: Don't error on shutdown
29f921
29f921
Right now we complain if shutdown happens while the display is
29f921
comming up.
29f921
29f921
This commit detects that case and avoids the error in that case.
29f921
---
29f921
 daemon/gdm-display.c | 28 +++++++++++++++++++++++++++-
29f921
 daemon/gdm-manager.c | 11 +++++++----
29f921
 2 files changed, 34 insertions(+), 5 deletions(-)
29f921
29f921
diff --git a/daemon/gdm-display.c b/daemon/gdm-display.c
29f921
index 9438fe72..a93857e9 100644
29f921
--- a/daemon/gdm-display.c
29f921
+++ b/daemon/gdm-display.c
29f921
@@ -66,86 +66,88 @@ typedef struct _GdmDisplayPrivate
29f921
         char                 *x11_display_name;
29f921
         int                   status;
29f921
         time_t                creation_time;
29f921
 
29f921
         char                 *x11_cookie;
29f921
         gsize                 x11_cookie_size;
29f921
         GdmDisplayAccessFile *access_file;
29f921
 
29f921
         guint                 finish_idle_id;
29f921
 
29f921
         xcb_connection_t     *xcb_connection;
29f921
         int                   xcb_screen_number;
29f921
 
29f921
         GDBusConnection      *connection;
29f921
         GdmDisplayAccessFile *user_access_file;
29f921
 
29f921
         GdmDBusDisplay       *display_skeleton;
29f921
         GDBusObjectSkeleton  *object_skeleton;
29f921
 
29f921
         GDBusProxy           *accountsservice_proxy;
29f921
 
29f921
         /* this spawns and controls the greeter session */
29f921
         GdmLaunchEnvironment *launch_environment;
29f921
 
29f921
         guint                 is_local : 1;
29f921
         guint                 is_initial : 1;
29f921
         guint                 allow_timed_login : 1;
29f921
         guint                 have_existing_user_accounts : 1;
29f921
         guint                 doing_initial_setup : 1;
29f921
         guint                 session_registered : 1;
29f921
+        guint                 shutting_down : 1;
29f921
 
29f921
         GStrv                 supported_session_types;
29f921
 } GdmDisplayPrivate;
29f921
 
29f921
 enum {
29f921
         PROP_0,
29f921
         PROP_ID,
29f921
         PROP_STATUS,
29f921
         PROP_SEAT_ID,
29f921
         PROP_SESSION_ID,
29f921
         PROP_SESSION_CLASS,
29f921
         PROP_SESSION_TYPE,
29f921
         PROP_REMOTE_HOSTNAME,
29f921
         PROP_X11_DISPLAY_NUMBER,
29f921
         PROP_X11_DISPLAY_NAME,
29f921
         PROP_X11_COOKIE,
29f921
         PROP_X11_AUTHORITY_FILE,
29f921
         PROP_IS_CONNECTED,
29f921
         PROP_IS_LOCAL,
29f921
         PROP_LAUNCH_ENVIRONMENT,
29f921
         PROP_IS_INITIAL,
29f921
         PROP_ALLOW_TIMED_LOGIN,
29f921
         PROP_HAVE_EXISTING_USER_ACCOUNTS,
29f921
         PROP_DOING_INITIAL_SETUP,
29f921
         PROP_SESSION_REGISTERED,
29f921
         PROP_SUPPORTED_SESSION_TYPES,
29f921
+        PROP_SHUTTING_DOWN,
29f921
 };
29f921
 
29f921
 static void     gdm_display_class_init  (GdmDisplayClass *klass);
29f921
 static void     gdm_display_init        (GdmDisplay      *self);
29f921
 static void     gdm_display_finalize    (GObject         *object);
29f921
 static void     queue_finish            (GdmDisplay      *self);
29f921
 static void     _gdm_display_set_status (GdmDisplay *self,
29f921
                                          int         status);
29f921
 static gboolean wants_initial_setup (GdmDisplay *self);
29f921
 G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (GdmDisplay, gdm_display, G_TYPE_OBJECT)
29f921
 
29f921
 GQuark
29f921
 gdm_display_error_quark (void)
29f921
 {
29f921
         static GQuark ret = 0;
29f921
         if (ret == 0) {
29f921
                 ret = g_quark_from_static_string ("gdm_display_error");
29f921
         }
29f921
 
29f921
         return ret;
29f921
 }
29f921
 
29f921
 time_t
29f921
 gdm_display_get_creation_time (GdmDisplay *self)
29f921
 {
29f921
         GdmDisplayPrivate *priv;
29f921
 
29f921
         g_return_val_if_fail (GDM_IS_DISPLAY (self), 0);
29f921
 
29f921
         priv = gdm_display_get_instance_private (self);
29f921
@@ -665,61 +667,61 @@ gdm_display_disconnect (GdmDisplay *self)
29f921
         }
29f921
 
29f921
         xcb_flush (priv->xcb_connection);
29f921
 
29f921
         g_clear_pointer (&priv->xcb_connection, xcb_disconnect);
29f921
 }
29f921
 
29f921
 gboolean
29f921
 gdm_display_unmanage (GdmDisplay *self)
29f921
 {
29f921
         GdmDisplayPrivate *priv;
29f921
 
29f921
         g_return_val_if_fail (GDM_IS_DISPLAY (self), FALSE);
29f921
 
29f921
         priv = gdm_display_get_instance_private (self);
29f921
 
29f921
         gdm_display_disconnect (self);
29f921
 
29f921
         if (priv->user_access_file != NULL) {
29f921
                 gdm_display_access_file_close (priv->user_access_file);
29f921
                 g_object_unref (priv->user_access_file);
29f921
                 priv->user_access_file = NULL;
29f921
         }
29f921
 
29f921
         if (priv->access_file != NULL) {
29f921
                 gdm_display_access_file_close (priv->access_file);
29f921
                 g_object_unref (priv->access_file);
29f921
                 priv->access_file = NULL;
29f921
         }
29f921
 
29f921
-        if (!priv->session_registered) {
29f921
+        if (!priv->session_registered && !priv->shutting_down) {
29f921
                 g_warning ("GdmDisplay: Session never registered, failing");
29f921
                 _gdm_display_set_status (self, GDM_DISPLAY_FAILED);
29f921
         } else {
29f921
                 _gdm_display_set_status (self, GDM_DISPLAY_UNMANAGED);
29f921
         }
29f921
 
29f921
         return TRUE;
29f921
 }
29f921
 
29f921
 gboolean
29f921
 gdm_display_get_id (GdmDisplay         *self,
29f921
                     char              **id,
29f921
                     GError            **error)
29f921
 {
29f921
         GdmDisplayPrivate *priv;
29f921
 
29f921
         g_return_val_if_fail (GDM_IS_DISPLAY (self), FALSE);
29f921
 
29f921
         priv = gdm_display_get_instance_private (self);
29f921
         if (id != NULL) {
29f921
                 *id = g_strdup (priv->id);
29f921
         }
29f921
 
29f921
         return TRUE;
29f921
 }
29f921
 
29f921
 gboolean
29f921
 gdm_display_get_x11_display_name (GdmDisplay   *self,
29f921
                                   char        **x11_display,
29f921
                                   GError      **error)
29f921
@@ -851,60 +853,70 @@ _gdm_display_set_x11_cookie (GdmDisplay     *self,
29f921
 {
29f921
         GdmDisplayPrivate *priv;
29f921
 
29f921
         priv = gdm_display_get_instance_private (self);
29f921
         g_free (priv->x11_cookie);
29f921
         priv->x11_cookie = g_strdup (x11_cookie);
29f921
 }
29f921
 
29f921
 static void
29f921
 _gdm_display_set_is_local (GdmDisplay     *self,
29f921
                            gboolean        is_local)
29f921
 {
29f921
         GdmDisplayPrivate *priv;
29f921
 
29f921
         priv = gdm_display_get_instance_private (self);
29f921
         g_debug ("GdmDisplay: local: %s", is_local? "yes" : "no");
29f921
         priv->is_local = is_local;
29f921
 }
29f921
 
29f921
 static void
29f921
 _gdm_display_set_session_registered (GdmDisplay     *self,
29f921
                                      gboolean        registered)
29f921
 {
29f921
         GdmDisplayPrivate *priv;
29f921
 
29f921
         priv = gdm_display_get_instance_private (self);
29f921
         g_debug ("GdmDisplay: session registered: %s", registered? "yes" : "no");
29f921
         priv->session_registered = registered;
29f921
 }
29f921
 
29f921
+static void
29f921
+_gdm_display_set_shutting_down (GdmDisplay     *self,
29f921
+                                gboolean        shutting_down)
29f921
+{
29f921
+        GdmDisplayPrivate *priv;
29f921
+
29f921
+        priv = gdm_display_get_instance_private (self);
29f921
+        priv->shutting_down = shutting_down;
29f921
+}
29f921
+
29f921
 static void
29f921
 _gdm_display_set_launch_environment (GdmDisplay           *self,
29f921
                                      GdmLaunchEnvironment *launch_environment)
29f921
 {
29f921
         GdmDisplayPrivate *priv;
29f921
 
29f921
         priv = gdm_display_get_instance_private (self);
29f921
 
29f921
         g_clear_object (&priv->launch_environment);
29f921
 
29f921
         priv->launch_environment = g_object_ref (launch_environment);
29f921
 }
29f921
 
29f921
 static void
29f921
 _gdm_display_set_is_initial (GdmDisplay     *self,
29f921
                              gboolean        initial)
29f921
 {
29f921
         GdmDisplayPrivate *priv;
29f921
 
29f921
         priv = gdm_display_get_instance_private (self);
29f921
         g_debug ("GdmDisplay: initial: %s", initial? "yes" : "no");
29f921
         priv->is_initial = initial;
29f921
 }
29f921
 
29f921
 static void
29f921
 _gdm_display_set_allow_timed_login (GdmDisplay     *self,
29f921
                                     gboolean        allow_timed_login)
29f921
 {
29f921
         GdmDisplayPrivate *priv;
29f921
 
29f921
@@ -962,60 +974,63 @@ gdm_display_set_property (GObject        *object,
29f921
         case PROP_REMOTE_HOSTNAME:
29f921
                 _gdm_display_set_remote_hostname (self, g_value_get_string (value));
29f921
                 break;
29f921
         case PROP_X11_DISPLAY_NUMBER:
29f921
                 _gdm_display_set_x11_display_number (self, g_value_get_int (value));
29f921
                 break;
29f921
         case PROP_X11_DISPLAY_NAME:
29f921
                 _gdm_display_set_x11_display_name (self, g_value_get_string (value));
29f921
                 break;
29f921
         case PROP_X11_COOKIE:
29f921
                 _gdm_display_set_x11_cookie (self, g_value_get_string (value));
29f921
                 break;
29f921
         case PROP_IS_LOCAL:
29f921
                 _gdm_display_set_is_local (self, g_value_get_boolean (value));
29f921
                 break;
29f921
         case PROP_ALLOW_TIMED_LOGIN:
29f921
                 _gdm_display_set_allow_timed_login (self, g_value_get_boolean (value));
29f921
                 break;
29f921
         case PROP_LAUNCH_ENVIRONMENT:
29f921
                 _gdm_display_set_launch_environment (self, g_value_get_object (value));
29f921
                 break;
29f921
         case PROP_IS_INITIAL:
29f921
                 _gdm_display_set_is_initial (self, g_value_get_boolean (value));
29f921
                 break;
29f921
         case PROP_SESSION_REGISTERED:
29f921
                 _gdm_display_set_session_registered (self, g_value_get_boolean (value));
29f921
                 break;
29f921
         case PROP_SUPPORTED_SESSION_TYPES:
29f921
                 _gdm_display_set_supported_session_types (self, g_value_get_boxed (value));
29f921
                 break;
29f921
+        case PROP_SHUTTING_DOWN:
29f921
+                _gdm_display_set_shutting_down (self, g_value_get_boolean (value));
29f921
+                break;
29f921
         default:
29f921
                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
29f921
                 break;
29f921
         }
29f921
 }
29f921
 
29f921
 static void
29f921
 gdm_display_get_property (GObject        *object,
29f921
                           guint           prop_id,
29f921
                           GValue         *value,
29f921
                           GParamSpec     *pspec)
29f921
 {
29f921
         GdmDisplay *self;
29f921
         GdmDisplayPrivate *priv;
29f921
 
29f921
         self = GDM_DISPLAY (object);
29f921
         priv = gdm_display_get_instance_private (self);
29f921
 
29f921
         switch (prop_id) {
29f921
         case PROP_ID:
29f921
                 g_value_set_string (value, priv->id);
29f921
                 break;
29f921
         case PROP_STATUS:
29f921
                 g_value_set_int (value, priv->status);
29f921
                 break;
29f921
         case PROP_SEAT_ID:
29f921
                 g_value_set_string (value, priv->seat_id);
29f921
                 break;
29f921
         case PROP_SESSION_ID:
29f921
                 g_value_set_string (value, priv->session_id);
29f921
@@ -1043,60 +1058,63 @@ gdm_display_get_property (GObject        *object,
29f921
                                      priv->access_file?
29f921
                                      gdm_display_access_file_get_path (priv->access_file) : NULL);
29f921
                 break;
29f921
         case PROP_IS_LOCAL:
29f921
                 g_value_set_boolean (value, priv->is_local);
29f921
                 break;
29f921
         case PROP_IS_CONNECTED:
29f921
                 g_value_set_boolean (value, priv->xcb_connection != NULL);
29f921
                 break;
29f921
         case PROP_LAUNCH_ENVIRONMENT:
29f921
                 g_value_set_object (value, priv->launch_environment);
29f921
                 break;
29f921
         case PROP_IS_INITIAL:
29f921
                 g_value_set_boolean (value, priv->is_initial);
29f921
                 break;
29f921
         case PROP_HAVE_EXISTING_USER_ACCOUNTS:
29f921
                 g_value_set_boolean (value, priv->have_existing_user_accounts);
29f921
                 break;
29f921
         case PROP_DOING_INITIAL_SETUP:
29f921
                 g_value_set_boolean (value, priv->doing_initial_setup);
29f921
                 break;
29f921
         case PROP_SESSION_REGISTERED:
29f921
                 g_value_set_boolean (value, priv->session_registered);
29f921
                 break;
29f921
         case PROP_ALLOW_TIMED_LOGIN:
29f921
                 g_value_set_boolean (value, priv->allow_timed_login);
29f921
                 break;
29f921
         case PROP_SUPPORTED_SESSION_TYPES:
29f921
                 g_value_set_boxed (value, priv->supported_session_types);
29f921
                 break;
29f921
+        case PROP_SHUTTING_DOWN:
29f921
+                g_value_set_boolean (value, priv->shutting_down);
29f921
+                break;
29f921
         default:
29f921
                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
29f921
                 break;
29f921
         }
29f921
 }
29f921
 
29f921
 static gboolean
29f921
 handle_get_id (GdmDBusDisplay        *skeleton,
29f921
                GDBusMethodInvocation *invocation,
29f921
                GdmDisplay            *self)
29f921
 {
29f921
         char *id;
29f921
 
29f921
         gdm_display_get_id (self, &id, NULL);
29f921
 
29f921
         gdm_dbus_display_complete_get_id (skeleton, invocation, id);
29f921
 
29f921
         g_free (id);
29f921
         return TRUE;
29f921
 }
29f921
 
29f921
 static gboolean
29f921
 handle_get_remote_hostname (GdmDBusDisplay        *skeleton,
29f921
                             GDBusMethodInvocation *invocation,
29f921
                             GdmDisplay            *self)
29f921
 {
29f921
         char *hostname;
29f921
 
29f921
         gdm_display_get_remote_hostname (self, &hostname, NULL);
29f921
 
29f921
@@ -1397,60 +1415,68 @@ gdm_display_class_init (GdmDisplayClass *klass)
29f921
                                          g_param_spec_boolean ("session-registered",
29f921
                                                                NULL,
29f921
                                                                NULL,
29f921
                                                                FALSE,
29f921
                                                                G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
29f921
 
29f921
         g_object_class_install_property (object_class,
29f921
                                          PROP_LAUNCH_ENVIRONMENT,
29f921
                                          g_param_spec_object ("launch-environment",
29f921
                                                               NULL,
29f921
                                                               NULL,
29f921
                                                               GDM_TYPE_LAUNCH_ENVIRONMENT,
29f921
                                                               G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
29f921
         g_object_class_install_property (object_class,
29f921
                                          PROP_STATUS,
29f921
                                          g_param_spec_int ("status",
29f921
                                                            "status",
29f921
                                                            "status",
29f921
                                                            -1,
29f921
                                                            G_MAXINT,
29f921
                                                            GDM_DISPLAY_UNMANAGED,
29f921
                                                            G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS));
29f921
 
29f921
         g_object_class_install_property (object_class,
29f921
                                          PROP_SUPPORTED_SESSION_TYPES,
29f921
                                          g_param_spec_boxed ("supported-session-types",
29f921
                                                              "supported session types",
29f921
                                                              "supported session types",
29f921
                                                              G_TYPE_STRV,
29f921
                                                              G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS));
29f921
+
29f921
+        g_object_class_install_property (object_class,
29f921
+                                         PROP_SHUTTING_DOWN,
29f921
+                                         g_param_spec_boolean ("shutting-down",
29f921
+                                                               NULL,
29f921
+                                                               NULL,
29f921
+                                                               FALSE,
29f921
+                                                               G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
29f921
 }
29f921
 
29f921
 static void
29f921
 gdm_display_init (GdmDisplay *self)
29f921
 {
29f921
         GdmDisplayPrivate *priv;
29f921
 
29f921
         priv = gdm_display_get_instance_private (self);
29f921
 
29f921
         priv->creation_time = time (NULL);
29f921
 }
29f921
 
29f921
 static void
29f921
 gdm_display_finalize (GObject *object)
29f921
 {
29f921
         GdmDisplay *self;
29f921
         GdmDisplayPrivate *priv;
29f921
 
29f921
         g_return_if_fail (object != NULL);
29f921
         g_return_if_fail (GDM_IS_DISPLAY (object));
29f921
 
29f921
         self = GDM_DISPLAY (object);
29f921
         priv = gdm_display_get_instance_private (self);
29f921
 
29f921
         g_return_if_fail (priv != NULL);
29f921
 
29f921
         g_debug ("GdmDisplay: Finalizing display: %s", priv->id);
29f921
         g_free (priv->id);
29f921
         g_free (priv->seat_id);
29f921
         g_free (priv->session_class);
29f921
diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c
29f921
index c70248f3..05851001 100644
29f921
--- a/daemon/gdm-manager.c
29f921
+++ b/daemon/gdm-manager.c
29f921
@@ -2759,117 +2759,120 @@ gdm_manager_init (GdmManager *manager)
29f921
                                                                                NULL,
29f921
                                                                                (GDestroyNotify)
29f921
                                                                                g_object_unref);
29f921
         manager->priv->transient_sessions = g_hash_table_new_full (NULL,
29f921
                                                                    NULL,
29f921
                                                                    (GDestroyNotify)
29f921
                                                                    NULL,
29f921
                                                                    (GDestroyNotify)
29f921
                                                                    g_object_unref);
29f921
         g_signal_connect (G_OBJECT (manager->priv->display_store),
29f921
                           "display-added",
29f921
                           G_CALLBACK (on_display_added),
29f921
                           manager);
29f921
 
29f921
         g_signal_connect (G_OBJECT (manager->priv->display_store),
29f921
                           "display-removed",
29f921
                           G_CALLBACK (on_display_removed),
29f921
                           manager);
29f921
 }
29f921
 
29f921
 static void
29f921
 unexport_display (const char *id,
29f921
                   GdmDisplay *display,
29f921
                   GdmManager *manager)
29f921
 {
29f921
         if (!g_dbus_connection_is_closed (manager->priv->connection))
29f921
                 g_dbus_object_manager_server_unexport (manager->priv->object_manager, id);
29f921
 }
29f921
 
29f921
 static void
29f921
-finish_display (const char *id,
29f921
-                GdmDisplay *display,
29f921
-                GdmManager *manager)
29f921
+shut_down_display (const char *id,
29f921
+                   GdmDisplay *display,
29f921
+                   GdmManager *manager)
29f921
 {
29f921
         gdm_display_stop_greeter_session (display);
29f921
+
29f921
+        g_object_set (G_OBJECT (display), "shutting-down", TRUE, NULL);
29f921
+
29f921
         if (gdm_display_get_status (display) == GDM_DISPLAY_MANAGED)
29f921
                 gdm_display_unmanage (display);
29f921
         gdm_display_finish (display);
29f921
 }
29f921
 
29f921
 static void
29f921
 gdm_manager_dispose (GObject *object)
29f921
 {
29f921
         GdmManager *manager;
29f921
 
29f921
         g_return_if_fail (object != NULL);
29f921
         g_return_if_fail (GDM_IS_MANAGER (object));
29f921
 
29f921
         manager = GDM_MANAGER (object);
29f921
 
29f921
         g_return_if_fail (manager->priv != NULL);
29f921
 
29f921
         gdm_manager_stop (manager);
29f921
 
29f921
         g_clear_weak_pointer (&manager->priv->automatic_login_display);
29f921
 
29f921
 #ifdef HAVE_LIBXDMCP
29f921
         g_clear_object (&manager->priv->xdmcp_factory);
29f921
 #endif
29f921
         g_clear_object (&manager->priv->local_factory);
29f921
         g_clear_pointer (&manager->priv->open_reauthentication_requests,
29f921
                          g_hash_table_unref);
29f921
         g_clear_pointer (&manager->priv->transient_sessions,
29f921
                          g_hash_table_unref);
29f921
 
29f921
         g_list_foreach (manager->priv->user_sessions,
29f921
                         (GFunc) gdm_session_close,
29f921
                         NULL);
29f921
         g_list_free_full (manager->priv->user_sessions, (GDestroyNotify) g_object_unref);
29f921
         manager->priv->user_sessions = NULL;
29f921
 
29f921
         g_signal_handlers_disconnect_by_func (G_OBJECT (manager->priv->display_store),
29f921
                                               G_CALLBACK (on_display_added),
29f921
                                               manager);
29f921
         g_signal_handlers_disconnect_by_func (G_OBJECT (manager->priv->display_store),
29f921
                                               G_CALLBACK (on_display_removed),
29f921
                                               manager);
29f921
 
29f921
         if (!g_dbus_connection_is_closed (manager->priv->connection)) {
29f921
                 gdm_display_store_foreach (manager->priv->display_store,
29f921
                                            (GdmDisplayStoreFunc)unexport_display,
29f921
                                            manager);
29f921
                 g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (manager));
29f921
         }
29f921
 
29f921
         gdm_display_store_foreach (manager->priv->display_store,
29f921
-                                   (GdmDisplayStoreFunc) finish_display,
29f921
+                                   (GdmDisplayStoreFunc) shut_down_display,
29f921
                                    manager);
29f921
 
29f921
         gdm_display_store_clear (manager->priv->display_store);
29f921
 
29f921
         g_dbus_object_manager_server_set_connection (manager->priv->object_manager, NULL);
29f921
 
29f921
         g_clear_object (&manager->priv->connection);
29f921
         g_clear_object (&manager->priv->object_manager);
29f921
         g_clear_object (&manager->priv->display_store);
29f921
 
29f921
         G_OBJECT_CLASS (gdm_manager_parent_class)->dispose (object);
29f921
 }
29f921
 
29f921
 GdmManager *
29f921
 gdm_manager_new (void)
29f921
 {
29f921
         if (manager_object != NULL) {
29f921
                 g_object_ref (manager_object);
29f921
         } else {
29f921
                 gboolean res;
29f921
 
29f921
                 manager_object = g_object_new (GDM_TYPE_MANAGER, NULL);
29f921
                 g_object_add_weak_pointer (manager_object,
29f921
                                            (gpointer *) &manager_object);
29f921
                 res = register_manager (manager_object);
29f921
                 if (! res) {
29f921
                         g_object_unref (manager_object);
29f921
                         return NULL;
29f921
                 }
29f921
         }
29f921
-- 
29f921
2.37.0.rc1
29f921