[glib: 3/4] gdbusobjectmanagerclient: Cancel GetManagedObjects on dispose
- From: Philip Withnall <pwithnall src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib: 3/4] gdbusobjectmanagerclient: Cancel GetManagedObjects on dispose
- Date: Mon, 28 Jun 2021 16:43:15 +0000 (UTC)
commit 693ca5eb01181a1e988023739f3156085fde42f1
Author: Guido Günther <agx sigxcpu org>
Date: Mon Jun 28 15:21:07 2021 +0200
gdbusobjectmanagerclient: Cancel GetManagedObjects on dispose
Make sure there's no async call lingering when disposing the object.
Signed-off-by: Guido Günther <agx sigxcpu org>
gio/gdbusobjectmanagerclient.c | 32 +++++++++++++++++++++++++++-----
1 file changed, 27 insertions(+), 5 deletions(-)
---
diff --git a/gio/gdbusobjectmanagerclient.c b/gio/gdbusobjectmanagerclient.c
index bc3fd3d5f..04c55995d 100644
--- a/gio/gdbusobjectmanagerclient.c
+++ b/gio/gdbusobjectmanagerclient.c
@@ -20,11 +20,13 @@
#include "config.h"
+#include "gcancellable.h"
#include "gdbusobjectmanager.h"
#include "gdbusobjectmanagerclient.h"
#include "gdbusobject.h"
#include "gdbusprivate.h"
#include "gioenumtypes.h"
+#include "gioerror.h"
#include "ginitable.h"
#include "gasyncresult.h"
#include "gasyncinitable.h"
@@ -144,6 +146,7 @@ struct _GDBusObjectManagerClientPrivate
gulong name_owner_signal_id;
gulong signal_signal_id;
+ GCancellable *cancel;
};
enum
@@ -191,6 +194,20 @@ static void process_get_all_result (GDBusObjectManagerClient *manager,
GVariant *value,
const gchar *name_owner);
+static void
+g_dbus_object_manager_client_dispose (GObject *object)
+{
+ GDBusObjectManagerClient *manager = G_DBUS_OBJECT_MANAGER_CLIENT (object);
+
+ if (manager->priv->cancel != NULL)
+ {
+ g_cancellable_cancel (manager->priv->cancel);
+ g_clear_object (&manager->priv->cancel);
+ }
+
+ G_OBJECT_CLASS (g_dbus_object_manager_client_parent_class)->dispose (object);
+}
+
static void
g_dbus_object_manager_client_finalize (GObject *object)
{
@@ -327,6 +344,7 @@ g_dbus_object_manager_client_class_init (GDBusObjectManagerClientClass *klass)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+ gobject_class->dispose = g_dbus_object_manager_client_dispose;
gobject_class->finalize = g_dbus_object_manager_client_finalize;
gobject_class->set_property = g_dbus_object_manager_client_set_property;
gobject_class->get_property = g_dbus_object_manager_client_get_property;
@@ -589,6 +607,7 @@ g_dbus_object_manager_client_init (GDBusObjectManagerClient *manager)
g_str_equal,
g_free,
(GDestroyNotify) g_object_unref);
+ manager->priv->cancel = g_cancellable_new ();
}
/* ---------------------------------------------------------------------------------------------------- */
@@ -1285,10 +1304,13 @@ on_get_managed_objects_finish (GObject *source,
if (value == NULL)
{
maybe_unsubscribe_signals (manager);
- g_warning ("Error calling GetManagedObjects() when name owner %s for name %s came back: %s",
- new_name_owner,
- manager->priv->name,
- error->message);
+ if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+ {
+ g_warning ("Error calling GetManagedObjects() when name owner %s for name %s came back: %s",
+ new_name_owner,
+ manager->priv->name,
+ error->message);
+ }
}
else
{
@@ -1373,7 +1395,7 @@ on_notify_g_name_owner (GObject *object,
NULL, /* parameters */
G_DBUS_CALL_FLAGS_NONE,
-1,
- NULL,
+ manager->priv->cancel,
on_get_managed_objects_finish,
weak_ref_new (G_OBJECT (manager)));
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]