Blame SOURCES/0009-libgdb-Try-to-reuse-connections-from-the-available-p.patch

b61949
From 3701174621efd15d06dcfccdca6e5aa8d2a37e41 Mon Sep 17 00:00:00 2001
b61949
From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= <mail@3v1n0.net>
b61949
Date: Sat, 2 Jun 2018 19:34:08 +0200
b61949
Subject: [PATCH 09/15] libgdb: Try to reuse connections from the available
b61949
 proxies
b61949
b61949
Instead of using the hard-to-maintain shared pointer to the dbus connection
b61949
to the manager and reset it when the proxies that use it are deleted, just
b61949
look which proxy is currently available and try to reuse the connection
b61949
from it.
b61949
b61949
Fixes #386
b61949
---
b61949
 libgdm/gdm-client.c | 70 +++++++++++++++++++++++++--------------------
b61949
 1 file changed, 39 insertions(+), 31 deletions(-)
b61949
b61949
diff --git a/libgdm/gdm-client.c b/libgdm/gdm-client.c
b61949
index 7b42b6c99..acf016a48 100644
b61949
--- a/libgdm/gdm-client.c
b61949
+++ b/libgdm/gdm-client.c
b61949
@@ -19,85 +19,106 @@
b61949
  *
b61949
  */
b61949
 
b61949
 #include "config.h"
b61949
 
b61949
 #include <stdlib.h>
b61949
 #include <stdio.h>
b61949
 #include <unistd.h>
b61949
 #include <string.h>
b61949
 
b61949
 #include <glib.h>
b61949
 #include <glib/gi18n.h>
b61949
 #include <glib-object.h>
b61949
 
b61949
 #include "gdm-client.h"
b61949
 #include "gdm-client-glue.h"
b61949
 #include "gdm-manager-glue.h"
b61949
 
b61949
 #define GDM_CLIENT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_CLIENT, GdmClientPrivate))
b61949
 
b61949
 #define SESSION_DBUS_PATH      "/org/gnome/DisplayManager/Session"
b61949
 
b61949
 struct GdmClientPrivate
b61949
 {
b61949
         GdmUserVerifier    *user_verifier;
b61949
         GHashTable         *user_verifier_extensions;
b61949
 
b61949
         GdmGreeter         *greeter;
b61949
         GdmRemoteGreeter   *remote_greeter;
b61949
         GdmChooser         *chooser;
b61949
-        GDBusConnection    *connection;
b61949
         char               *address;
b61949
 
b61949
         char              **enabled_extensions;
b61949
 };
b61949
 
b61949
 static void     gdm_client_class_init  (GdmClientClass *klass);
b61949
 static void     gdm_client_init        (GdmClient      *client);
b61949
 static void     gdm_client_finalize    (GObject        *object);
b61949
 
b61949
 G_DEFINE_TYPE (GdmClient, gdm_client, G_TYPE_OBJECT);
b61949
 
b61949
 static gpointer client_object = NULL;
b61949
 
b61949
 GQuark
b61949
 gdm_client_error_quark (void)
b61949
 {
b61949
         static GQuark error_quark = 0;
b61949
 
b61949
         if (error_quark == 0)
b61949
                 error_quark = g_quark_from_static_string ("gdm-client");
b61949
 
b61949
         return error_quark;
b61949
 }
b61949
 
b61949
+static GDBusConnection *
b61949
+gdm_client_get_open_connection (GdmClient *client)
b61949
+{
b61949
+        GDBusProxy *proxy = NULL;
b61949
+
b61949
+        if (client->priv->user_verifier != NULL) {
b61949
+                proxy = G_DBUS_PROXY (client->priv->user_verifier);
b61949
+        } else if (client->priv->greeter != NULL) {
b61949
+                proxy = G_DBUS_PROXY (client->priv->greeter);
b61949
+        } else if (client->priv->remote_greeter != NULL) {
b61949
+                proxy = G_DBUS_PROXY (client->priv->remote_greeter);
b61949
+        } else if (client->priv->chooser != NULL) {
b61949
+                proxy = G_DBUS_PROXY (client->priv->chooser);
b61949
+        }
b61949
+
b61949
+        if (proxy != NULL) {
b61949
+                return g_dbus_proxy_get_connection (proxy);
b61949
+        }
b61949
+
b61949
+        return NULL;
b61949
+}
b61949
+
b61949
 static void
b61949
 on_got_manager (GObject             *object,
b61949
                 GAsyncResult        *result,
b61949
                 GTask               *task)
b61949
 {
b61949
         GdmClient *client;
b61949
         GError    *error;
b61949
         g_autoptr(GdmManager) manager = NULL;
b61949
 
b61949
         client = GDM_CLIENT (g_async_result_get_source_object (G_ASYNC_RESULT (task)));
b61949
 
b61949
         error = NULL;
b61949
         manager = gdm_manager_proxy_new_finish (result, &error);
b61949
 
b61949
         if (error != NULL) {
b61949
                 g_task_return_error (task, error);
b61949
         } else {
b61949
                 g_task_return_pointer (task,
b61949
                                        g_object_ref (manager),
b61949
                                        (GDestroyNotify) g_object_unref);
b61949
         }
b61949
 
b61949
         g_object_unref (task);
b61949
         g_object_unref (client);
b61949
 }
b61949
 
b61949
 static void
b61949
 get_manager (GdmClient           *client,
b61949
              GCancellable        *cancellable,
b61949
              GAsyncReadyCallback  callback,
b61949
@@ -372,107 +393,106 @@ on_got_manager_for_reauthentication (GdmClient           *client,
b61949
         GCancellable *cancellable;
b61949
         GdmManager   *manager;
b61949
         char         *username;
b61949
         GError       *error;
b61949
 
b61949
         error = NULL;
b61949
         manager = g_task_propagate_pointer (G_TASK (result), &error);
b61949
         if (manager == NULL) {
b61949
                 g_task_return_error (task, error);
b61949
                 g_object_unref (task);
b61949
                 return;
b61949
         }
b61949
 
b61949
         cancellable = g_task_get_cancellable (task);
b61949
         username = g_object_get_data (G_OBJECT (task), "username");
b61949
         gdm_manager_call_open_reauthentication_channel (manager,
b61949
                                                         username,
b61949
                                                         cancellable,
b61949
                                                         (GAsyncReadyCallback)
b61949
                                                         on_reauthentication_channel_opened,
b61949
                                                         task);
b61949
         g_object_unref (manager);
b61949
 }
b61949
 
b61949
 static GDBusConnection *
b61949
 gdm_client_get_connection_sync (GdmClient      *client,
b61949
                                 GCancellable   *cancellable,
b61949
                                 GError        **error)
b61949
 {
b61949
         g_autoptr(GdmManager) manager = NULL;
b61949
+        GDBusConnection *connection;
b61949
         gboolean ret;
b61949
 
b61949
         g_return_val_if_fail (GDM_IS_CLIENT (client), FALSE);
b61949
 
b61949
-        if (client->priv->connection != NULL) {
b61949
-                return g_object_ref (client->priv->connection);
b61949
+        connection = gdm_client_get_open_connection (client);
b61949
+
b61949
+        if (connection != NULL) {
b61949
+                return g_object_ref (connection);
b61949
         }
b61949
 
b61949
         manager = gdm_manager_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
b61949
                                                       G_DBUS_PROXY_FLAGS_NONE,
b61949
                                                       "org.gnome.DisplayManager",
b61949
                                                       "/org/gnome/DisplayManager/Manager",
b61949
                                                       cancellable,
b61949
                                                       error);
b61949
 
b61949
         if (manager == NULL) {
b61949
                 goto out;
b61949
         }
b61949
 
b61949
         ret = gdm_manager_call_open_session_sync (manager,
b61949
                                                   &client->priv->address,
b61949
                                                   cancellable,
b61949
                                                   error);
b61949
 
b61949
         if (!ret) {
b61949
                 goto out;
b61949
         }
b61949
 
b61949
         g_debug ("GdmClient: connecting to address: %s", client->priv->address);
b61949
 
b61949
-        client->priv->connection = g_dbus_connection_new_for_address_sync (client->priv->address,
b61949
-                                                                           G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT,
b61949
-                                                                           NULL,
b61949
-                                                                           cancellable,
b61949
-                                                                           error);
b61949
+        connection = g_dbus_connection_new_for_address_sync (client->priv->address,
b61949
+                                                             G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT,
b61949
+                                                             NULL,
b61949
+                                                             cancellable,
b61949
+                                                             error);
b61949
 
b61949
-        if (client->priv->connection == NULL) {
b61949
+        if (connection == NULL) {
b61949
                 g_clear_pointer (&client->priv->address, g_free);
b61949
                 goto out;
b61949
         }
b61949
 
b61949
-        g_object_add_weak_pointer (G_OBJECT (client->priv->connection),
b61949
-                                   (gpointer *)
b61949
-                                   &client->priv->connection);
b61949
-
b61949
  out:
b61949
-        return client->priv->connection;
b61949
+        return connection;
b61949
 }
b61949
 
b61949
 static void
b61949
 on_connected (GObject            *source_object,
b61949
               GAsyncResult       *result,
b61949
               GTask              *task)
b61949
 {
b61949
         GDBusConnection *connection;
b61949
         GError *error;
b61949
 
b61949
         error = NULL;
b61949
         connection = g_dbus_connection_new_for_address_finish (result, &error);
b61949
         if (!connection) {
b61949
                 g_task_return_error (task, error);
b61949
                 g_object_unref (task);
b61949
                 return;
b61949
         }
b61949
 
b61949
         g_task_return_pointer (task,
b61949
                                g_object_ref (connection),
b61949
                                (GDestroyNotify) g_object_unref);
b61949
         g_object_unref (task);
b61949
         g_object_unref (connection);
b61949
 }
b61949
 
b61949
 static void
b61949
 on_session_opened (GdmManager         *manager,
b61949
                    GAsyncResult       *result,
b61949
                    GTask              *task)
b61949
 {
b61949
@@ -518,87 +538,83 @@ on_got_manager_for_opening_connection (GdmClient           *client,
b61949
         if (manager == NULL) {
b61949
                 g_task_return_error (task, error);
b61949
                 g_object_unref (task);
b61949
                 return;
b61949
         }
b61949
 
b61949
         cancellable = g_task_get_cancellable (task);
b61949
         gdm_manager_call_open_session (manager,
b61949
                                        cancellable,
b61949
                                        (GAsyncReadyCallback)
b61949
                                        on_session_opened,
b61949
                                        task);
b61949
 
b61949
         g_object_unref (manager);
b61949
 }
b61949
 
b61949
 static GDBusConnection *
b61949
 gdm_client_get_connection_finish (GdmClient      *client,
b61949
                                   GAsyncResult   *result,
b61949
                                   GError        **error)
b61949
 {
b61949
         GDBusConnection *connection;
b61949
 
b61949
         g_return_val_if_fail (GDM_IS_CLIENT (client), FALSE);
b61949
 
b61949
         connection = g_task_propagate_pointer (G_TASK (result), error);
b61949
         if (connection == NULL) {
b61949
                 return NULL;
b61949
         }
b61949
 
b61949
-        if (client->priv->connection == NULL) {
b61949
-                client->priv->connection = connection;
b61949
-                g_object_add_weak_pointer (G_OBJECT (client->priv->connection),
b61949
-                                           (gpointer *) &client->priv->connection);
b61949
-        }
b61949
-
b61949
         return connection;
b61949
 }
b61949
 
b61949
 static void
b61949
 gdm_client_get_connection (GdmClient           *client,
b61949
                             GCancellable        *cancellable,
b61949
                             GAsyncReadyCallback  callback,
b61949
                             gpointer             user_data)
b61949
 {
b61949
         GTask *task;
b61949
+        GDBusConnection *connection;
b61949
 
b61949
         g_return_if_fail (GDM_IS_CLIENT (client));
b61949
 
b61949
         task = g_task_new (G_OBJECT (client),
b61949
                            cancellable,
b61949
                            callback,
b61949
                            user_data);
b61949
 
b61949
-        if (client->priv->connection != NULL) {
b61949
+        connection = gdm_client_get_open_connection (client);
b61949
+        if (connection != NULL) {
b61949
             g_task_return_pointer (task,
b61949
-                                   g_object_ref (client->priv->connection),
b61949
+                                   g_object_ref (connection),
b61949
                                    (GDestroyNotify) g_object_unref);
b61949
             g_object_unref (task);
b61949
             return;
b61949
         }
b61949
 
b61949
         get_manager (client,
b61949
                      cancellable,
b61949
                      (GAsyncReadyCallback)
b61949
                      on_got_manager_for_opening_connection,
b61949
                      task);
b61949
 }
b61949
 
b61949
 /**
b61949
  * gdm_client_open_reauthentication_channel_sync:
b61949
  * @client: a #GdmClient
b61949
  * @username: user to reauthenticate
b61949
  * @cancellable: a #GCancellable
b61949
  * @error: a #GError
b61949
  *
b61949
  * Gets a #GdmUserVerifier object that can be used to
b61949
  * reauthenticate an already logged in user. Free with
b61949
  * g_object_unref to close reauthentication channel.
b61949
  *
b61949
  * Returns: (transfer full): #GdmUserVerifier or %NULL if @username is not
b61949
  * already logged in.
b61949
  */
b61949
 GdmUserVerifier *
b61949
 gdm_client_open_reauthentication_channel_sync (GdmClient     *client,
b61949
                                                const char    *username,
b61949
                                                GCancellable  *cancellable,
b61949
@@ -748,61 +764,61 @@ gdm_client_get_user_verifier_sync (GdmClient     *client,
b61949
                                                                         G_DBUS_PROXY_FLAGS_NONE,
b61949
                                                                         NULL,
b61949
                                                                         SESSION_DBUS_PATH,
b61949
                                                                         cancellable,
b61949
                                                                         error);
b61949
 
b61949
         if (client->priv->user_verifier != NULL) {
b61949
                 g_object_add_weak_pointer (G_OBJECT (client->priv->user_verifier),
b61949
                                            (gpointer *)
b61949
                                            &client->priv->user_verifier);
b61949
                 if (client->priv->enabled_extensions != NULL) {
b61949
                         gboolean res;
b61949
 
b61949
                         client->priv->user_verifier_extensions = g_hash_table_new_full (g_str_hash,
b61949
                                                                                         g_str_equal,
b61949
                                                                                         NULL,
b61949
                                                                                         (GDestroyNotify)
b61949
                                                                                         free_interface_skeleton);
b61949
                         res = gdm_user_verifier_call_enable_extensions_sync (client->priv->user_verifier,
b61949
                                                                             (const char * const *)
b61949
                                                                              client->priv->enabled_extensions,
b61949
                                                                              cancellable,
b61949
                                                                              NULL);
b61949
 
b61949
                         if (res) {
b61949
                                 size_t i;
b61949
                                 for (i = 0; client->priv->enabled_extensions[i] != NULL; i++) {
b61949
                                             if (strcmp (client->priv->enabled_extensions[i],
b61949
                                                         gdm_user_verifier_choice_list_interface_info ()->name) == 0) {
b61949
                                                         GdmUserVerifierChoiceList *choice_list_interface;
b61949
-                                                        choice_list_interface = gdm_user_verifier_choice_list_proxy_new_sync (client->priv->connection,
b61949
+                                                        choice_list_interface = gdm_user_verifier_choice_list_proxy_new_sync (connection,
b61949
                                                                                                                               G_DBUS_PROXY_FLAGS_NONE,
b61949
                                                                                                                               NULL,
b61949
                                                                                                                               SESSION_DBUS_PATH,
b61949
                                                                                                                               cancellable,
b61949
                                                                                                                               NULL);
b61949
                                                         if (choice_list_interface != NULL)
b61949
                                                                     g_hash_table_insert (client->priv->user_verifier_extensions, client->priv->enabled_extensions[i], choice_list_interface);
b61949
                                             }
b61949
                                 }
b61949
                         }
b61949
                 }
b61949
         }
b61949
 
b61949
         return client->priv->user_verifier;
b61949
 }
b61949
 
b61949
 static void
b61949
 on_connection_for_user_verifier (GdmClient          *client,
b61949
                                  GAsyncResult       *result,
b61949
                                  GTask              *task)
b61949
 {
b61949
         g_autoptr(GDBusConnection) connection = NULL;
b61949
         GCancellable *cancellable;
b61949
         GError       *error;
b61949
 
b61949
         error = NULL;
b61949
         connection = gdm_client_get_connection_finish (client, result, &error);
b61949
 
b61949
         if (connection == NULL) {
b61949
                 g_task_return_error (task, error);
b61949
@@ -1482,68 +1498,60 @@ gdm_client_finalize (GObject *object)
b61949
         g_return_if_fail (GDM_IS_CLIENT (object));
b61949
 
b61949
         client = GDM_CLIENT (object);
b61949
 
b61949
         g_return_if_fail (client->priv != NULL);
b61949
 
b61949
         if (client->priv->user_verifier != NULL) {
b61949
                 g_object_remove_weak_pointer (G_OBJECT (client->priv->user_verifier),
b61949
                                               (gpointer *)
b61949
                                               &client->priv->user_verifier);
b61949
         }
b61949
 
b61949
         if (client->priv->greeter != NULL) {
b61949
                 g_object_remove_weak_pointer (G_OBJECT (client->priv->greeter),
b61949
                                               (gpointer *)
b61949
                                               &client->priv->greeter);
b61949
         }
b61949
 
b61949
         if (client->priv->remote_greeter != NULL) {
b61949
                 g_object_remove_weak_pointer (G_OBJECT (client->priv->remote_greeter),
b61949
                                               (gpointer *)
b61949
                                               &client->priv->remote_greeter);
b61949
         }
b61949
 
b61949
         if (client->priv->chooser != NULL) {
b61949
                 g_object_remove_weak_pointer (G_OBJECT (client->priv->chooser),
b61949
                                               (gpointer *)
b61949
                                               &client->priv->chooser);
b61949
         }
b61949
 
b61949
-        if (client->priv->connection != NULL) {
b61949
-                g_object_remove_weak_pointer (G_OBJECT (client->priv->connection),
b61949
-                                              (gpointer *)
b61949
-                                              &client->priv->connection);
b61949
-        }
b61949
-
b61949
-        g_clear_object (&client->priv->connection);
b61949
-
b61949
         g_strfreev (client->priv->enabled_extensions);
b61949
         g_free (client->priv->address);
b61949
 
b61949
         G_OBJECT_CLASS (gdm_client_parent_class)->finalize (object);
b61949
 }
b61949
 
b61949
 GdmClient *
b61949
 gdm_client_new (void)
b61949
 {
b61949
         if (client_object != NULL) {
b61949
                 g_object_ref (client_object);
b61949
         } else {
b61949
                 client_object = g_object_new (GDM_TYPE_CLIENT, NULL);
b61949
                 g_object_add_weak_pointer (client_object,
b61949
                                            (gpointer *) &client_object);
b61949
         }
b61949
 
b61949
         return GDM_CLIENT (client_object);
b61949
 }
b61949
 
b61949
 
b61949
 /**
b61949
  * gdm_client_set_enabled_extensions:
b61949
  * @client: a #GdmClient
b61949
  * @extensions: (array zero-terminated=1) (element-type utf8): a list of extensions
b61949
  *
b61949
  * Enables GDM's pam extensions.  Currently, only
b61949
  * org.gnome.DisplayManager.UserVerifier.ChoiceList is supported.
b61949
  */
b61949
 void
b61949
-- 
52125b
2.25.1
b61949