[gupnp] Hold references while doing async calls
- From: Jens Georg <jensgeorg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gupnp] Hold references while doing async calls
- Date: Fri, 16 Aug 2013 11:32:25 +0000 (UTC)
commit a9e09f06a06f4ee8686c83f94cfc58a3383f352e
Author: Olivier CrĂȘte <olivier crete collabora com>
Date: Mon Jun 24 18:22:48 2013 -0400
Hold references while doing async calls
https://bugzilla.gnome.org/show_bug.cgi?id=694454
libgupnp/gupnp-network-manager.c | 43 +++++++++++++++++++++++++------------
1 files changed, 29 insertions(+), 14 deletions(-)
---
diff --git a/libgupnp/gupnp-network-manager.c b/libgupnp/gupnp-network-manager.c
index 18b05e1..3b4e424 100644
--- a/libgupnp/gupnp-network-manager.c
+++ b/libgupnp/gupnp-network-manager.c
@@ -128,9 +128,9 @@ nm_device_new (GUPnPNetworkManager *manager,
nm_device = g_slice_new0 (NMDevice);
- nm_device->manager = manager;
- nm_device->proxy = device_proxy;
g_atomic_int_set (&nm_device->ref_count, 1);
+ nm_device->manager = g_object_ref (manager);
+ nm_device->proxy = g_object_ref (device_proxy);
return nm_device;
}
@@ -163,6 +163,8 @@ nm_device_unref (NMDevice *nm_device)
g_object_unref (nm_device->context);
}
+ g_object_unref (nm_device->proxy);
+ g_object_unref (nm_device->manager);
g_slice_free (NMDevice, nm_device);
}
@@ -280,9 +282,13 @@ ap_proxy_new_cb (GObject *source_object,
if (G_UNLIKELY (error != NULL)) {
g_message ("Failed to create D-Bus proxy: %s", error->message);
g_error_free (error);
+ goto done;
}
create_context_for_device (nm_device);
+
+done:
+ nm_device_unref (nm_device);
}
static void
@@ -315,7 +321,7 @@ on_wifi_device_activated (NMDevice *nm_device)
AP_INTERFACE,
nm_device->manager->priv->cancellable,
ap_proxy_new_cb,
- nm_device);
+ nm_device_ref (nm_device));
}
g_variant_unref (value);
@@ -412,9 +418,13 @@ wifi_proxy_new_cb (GObject *source_object,
if (G_UNLIKELY (error != NULL)) {
g_message ("Failed to create D-Bus proxy: %s", error->message);
g_error_free (error);
+ goto done;
}
use_new_device (nm_device->manager, nm_device);
+
+done:
+ nm_device_unref (nm_device);
}
static void
@@ -436,21 +446,21 @@ device_proxy_new_cb (GObject *source_object,
g_message ("Failed to create D-Bus proxy: %s", error->message);
g_error_free (error);
- return;
+ goto done;
}
value = g_dbus_proxy_get_cached_property (device_proxy, "DeviceType");
if (G_UNLIKELY (value == NULL)) {
g_object_unref (device_proxy);
- return;
+ goto done;
}
if (G_UNLIKELY (!g_variant_is_of_type (value, G_VARIANT_TYPE_UINT32))) {
g_variant_unref (value);
g_object_unref (device_proxy);
- return;
+ goto done;
}
type = g_variant_get_uint32 (value);
@@ -470,9 +480,12 @@ device_proxy_new_cb (GObject *source_object,
WIFI_INTERFACE,
manager->priv->cancellable,
wifi_proxy_new_cb,
- nm_device);
+ nm_device_ref (nm_device));
} else
use_new_device (manager, nm_device);
+
+done:
+ g_object_unref (manager);
}
static int
@@ -514,7 +527,7 @@ on_manager_signal (GDBusProxy *proxy,
DEVICE_INTERFACE,
manager->priv->cancellable,
device_proxy_new_cb,
- manager);
+ g_object_ref (manager));
g_free (device_path);
} else if (g_strcmp0 (signal_name, "DeviceRemoved") == 0) {
GList *device_node;
@@ -567,8 +580,7 @@ get_devices_cb (GObject *source_object,
error->message);
g_error_free (error);
-
- return;
+ goto done;
}
g_variant_get_child (ret, 0, "ao", &device_iter);
@@ -581,10 +593,13 @@ get_devices_cb (GObject *source_object,
DEVICE_INTERFACE,
manager->priv->cancellable,
device_proxy_new_cb,
- user_data);
+ g_object_ref (user_data));
g_variant_iter_free (device_iter);
g_variant_unref (ret);
+
+done:
+ g_object_unref (manager);
}
static void
@@ -598,8 +613,8 @@ schedule_loopback_context_creation (GUPnPNetworkManager *manager)
g_main_context_get_thread_default ());
g_source_set_callback (manager->priv->idle_context_creation_src,
create_loopback_context,
- manager,
- NULL);
+ g_object_ref (manager),
+ (GDestroyNotify) g_object_unref);
g_source_unref (manager->priv->idle_context_creation_src);
}
@@ -642,7 +657,7 @@ init_network_manager (GUPnPNetworkManager *manager)
-1,
priv->cancellable,
get_devices_cb,
- manager);
+ g_object_ref (manager));
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]