diff options
author | Peter Wu <peter@lekensteyn.nl> | 2014-11-18 10:12:56 +0100 |
---|---|---|
committer | Peter Wu <peter@lekensteyn.nl> | 2014-11-18 10:30:51 +0100 |
commit | a8366e2a6a3f013d527bbba912eee0e59f08224b (patch) | |
tree | ad8484fed457f7e2be0daa5cea3bfce969419618 /src/linux/up-backend.c | |
parent | 20076ab59ee4ff46bf24488d112515c16a54657a (diff) | |
download | upower-a8366e2a6a3f013d527bbba912eee0e59f08224b.tar.gz |
[WIP] attempt to fix refcount leak of UpDaemondaemon-mess
Debug in GDB with:
break up-main.c:260 # just after daemon = up_daemon_new ()
p &daemon->parent.ref_count
break *(guint *)ADDR_PRINTED_ABOVE
commands
bt
c
end
c
Refcount of daemon was over 100 at the end...
Diffstat (limited to 'src/linux/up-backend.c')
-rw-r--r-- | src/linux/up-backend.c | 36 |
1 files changed, 30 insertions, 6 deletions
diff --git a/src/linux/up-backend.c b/src/linux/up-backend.c index f45ce29..71e7ef8 100644 --- a/src/linux/up-backend.c +++ b/src/linux/up-backend.c @@ -340,6 +340,36 @@ up_backend_coldplug (UpBackend *backend, UpDaemon *daemon) return TRUE; } +/** + * up_backend_unplug: + * + * Initiates destruction of %UpBackend, undoing the effects of + * up_backend_coldplug. + */ +void +up_backend_unplug (UpBackend *backend) +{ + GList *keys, *item; + GUdevDevice *native; + + if (backend->priv->gudev_client != NULL && backend->priv->device_list != NULL) { + keys = up_device_list_get_keys (backend->priv->device_list); + for (item = keys; item != NULL; item = item->next) { + native = g_udev_client_query_by_sysfs_path (backend->priv->gudev_client, item->data); + if (native != NULL) + up_backend_device_remove (backend, native); + } + g_list_free (keys); + } + + if (backend->priv->gudev_client != NULL) + g_object_unref (backend->priv->gudev_client); + if (backend->priv->device_list != NULL) + g_object_unref (backend->priv->device_list); + if (backend->priv->daemon != NULL) + g_object_unref (backend->priv->daemon); +} + static gboolean check_action_result (GVariant *result) { @@ -495,12 +525,6 @@ up_backend_finalize (GObject *object) backend = UP_BACKEND (object); g_object_unref (backend->priv->config); - if (backend->priv->daemon != NULL) - g_object_unref (backend->priv->daemon); - if (backend->priv->device_list != NULL) - g_object_unref (backend->priv->device_list); - if (backend->priv->gudev_client != NULL) - g_object_unref (backend->priv->gudev_client); g_clear_object (&backend->priv->logind_proxy); g_object_unref (backend->priv->managed_devices); |