[gupnp] Hold references while doing async calls



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]