diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2012-03-30 13:12:22 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2012-03-30 13:47:00 +0200 |
commit | 0372e73abd413c94791e9a7f8f88f3acaf533c06 (patch) | |
tree | 676a5e5eb379ce26a36059097218e1d504b824a1 | |
parent | 94d46a43877107f9b558946a2f5dff0d95f02ca5 (diff) |
port-probe-cache: ensure we cleanup every possible leftover
-rw-r--r-- | src/mm-manager.c | 3 | ||||
-rw-r--r-- | src/mm-port-probe-cache.c | 27 | ||||
-rw-r--r-- | src/mm-port-probe-cache.h | 3 |
3 files changed, 21 insertions, 12 deletions
diff --git a/src/mm-manager.c b/src/mm-manager.c index 49a6b418..8817b731 100644 --- a/src/mm-manager.c +++ b/src/mm-manager.c @@ -713,7 +713,6 @@ mm_manager_shutdown (MMManager *self) /* Cancel all ongoing auth requests */ g_cancellable_cancel (self->priv->authp_cancellable); - modems = g_hash_table_get_values (self->priv->modems); for (iter = modems; iter; iter = g_list_next (iter)) { MMBaseModem *modem = MM_BASE_MODEM (iter->data); @@ -975,6 +974,8 @@ finalize (GObject *object) g_hash_table_destroy (priv->modems); + mm_port_probe_cache_clear (); + if (priv->udev) g_object_unref (priv->udev); diff --git a/src/mm-port-probe-cache.c b/src/mm-port-probe-cache.c index 113b5774..86bfb6a2 100644 --- a/src/mm-port-probe-cache.c +++ b/src/mm-port-probe-cache.c @@ -29,6 +29,13 @@ get_key (GUdevDevice *port) g_udev_device_get_name (port)); } +static void +probe_remove (MMPortProbe *probe) +{ + mm_port_probe_run_cancel (probe); + g_object_unref (probe); +} + MMPortProbe * mm_port_probe_cache_get (GUdevDevice *port, const gchar *physdev_path, @@ -43,7 +50,7 @@ mm_port_probe_cache_get (GUdevDevice *port, cache = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, - g_object_unref); + (GDestroyNotify)probe_remove); } else { probe = g_hash_table_lookup (cache, key); } @@ -51,30 +58,30 @@ mm_port_probe_cache_get (GUdevDevice *port, if (!probe) { probe = mm_port_probe_new (port, physdev_path, driver); g_hash_table_insert (cache, key, probe); - key = NULL; - } + } else + g_free (key); - g_free (key); return g_object_ref (probe); } void mm_port_probe_cache_remove (GUdevDevice *port) { - MMPortProbe *probe = NULL; gchar *key; if (G_UNLIKELY (!cache)) return; key = get_key (port); - probe = g_hash_table_lookup (cache, key); - if (probe) { - mm_port_probe_run_cancel (probe); - g_object_unref (probe); - } g_hash_table_remove (cache, key); g_free (key); } +void +mm_port_probe_cache_clear (void) +{ + if (G_UNLIKELY (!cache)) + return; + g_hash_table_remove_all (cache); +} diff --git a/src/mm-port-probe-cache.h b/src/mm-port-probe-cache.h index 86e8ab92..af5f8531 100644 --- a/src/mm-port-probe-cache.h +++ b/src/mm-port-probe-cache.h @@ -26,5 +26,6 @@ MMPortProbe *mm_port_probe_cache_get (GUdevDevice *port, void mm_port_probe_cache_remove (GUdevDevice *port); -#endif /* MM_PORT_PROBE_CACHE_H */ +void mm_port_probe_cache_clear (void); +#endif /* MM_PORT_PROBE_CACHE_H */ |