From 2c666e3e166b2992f114325e3ec53f28f98738df Mon Sep 17 00:00:00 2001 From: Tanu Kaskinen Date: Tue, 12 Feb 2013 21:36:57 +0200 Subject: [PATCH] idxset: Add pa_idxset_remove_all() Slightly nicer than using pa_idxset_steal_first() in a loop. --- src/modules/alsa/module-alsa-card.c | 16 ++++------------ src/pulsecore/core-scache.c | 5 +---- src/pulsecore/idxset.c | 23 ++++++++++++++--------- src/pulsecore/idxset.h | 3 +++ src/pulsecore/module.c | 4 +--- src/pulsecore/protocol-dbus.c | 11 ++--------- 6 files changed, 25 insertions(+), 37 deletions(-) diff --git a/src/modules/alsa/module-alsa-card.c b/src/modules/alsa/module-alsa-card.c index 3c995f8f..3f5af34a 100644 --- a/src/modules/alsa/module-alsa-card.c +++ b/src/modules/alsa/module-alsa-card.c @@ -746,19 +746,11 @@ void pa__done(pa_module*m) { if (u->jacks) pa_hashmap_free(u->jacks, NULL); - if (u->card && u->card->sinks) { - pa_sink *s; + if (u->card && u->card->sinks) + pa_idxset_remove_all(u->card->sinks, (pa_free_cb_t) pa_alsa_sink_free); - while ((s = pa_idxset_steal_first(u->card->sinks, NULL))) - pa_alsa_sink_free(s); - } - - if (u->card && u->card->sources) { - pa_source *s; - - while ((s = pa_idxset_steal_first(u->card->sources, NULL))) - pa_alsa_source_free(s); - } + if (u->card && u->card->sources) + pa_idxset_remove_all(u->card->sources, (pa_free_cb_t) pa_alsa_source_free); if (u->card) pa_card_free(u->card); diff --git a/src/pulsecore/core-scache.c b/src/pulsecore/core-scache.c index 73f65d2c..64bc4b3d 100644 --- a/src/pulsecore/core-scache.c +++ b/src/pulsecore/core-scache.c @@ -282,12 +282,9 @@ int pa_scache_remove_item(pa_core *c, const char *name) { } void pa_scache_free_all(pa_core *c) { - pa_scache_entry *e; - pa_assert(c); - while ((e = pa_idxset_steal_first(c->scache, NULL))) - free_entry(e); + pa_idxset_remove_all(c->scache, (pa_free_cb_t) free_entry); if (c->scache_auto_unload_event) { c->mainloop->time_free(c->scache_auto_unload_event); diff --git a/src/pulsecore/idxset.c b/src/pulsecore/idxset.c index fc3ea58c..27e4980d 100644 --- a/src/pulsecore/idxset.c +++ b/src/pulsecore/idxset.c @@ -142,15 +142,7 @@ static void remove_entry(pa_idxset *s, struct idxset_entry *e) { void pa_idxset_free(pa_idxset *s, pa_free_cb_t free_cb) { pa_assert(s); - while (s->iterate_list_head) { - void *data = s->iterate_list_head->data; - - remove_entry(s, s->iterate_list_head); - - if (free_cb) - free_cb(data); - } - + pa_idxset_remove_all(s, free_cb); pa_xfree(s); } @@ -308,6 +300,19 @@ void* pa_idxset_remove_by_data(pa_idxset*s, const void *data, uint32_t *idx) { return r; } +void pa_idxset_remove_all(pa_idxset *s, pa_free_cb_t free_cb) { + pa_assert(s); + + while (s->iterate_list_head) { + void *data = s->iterate_list_head->data; + + remove_entry(s, s->iterate_list_head); + + if (free_cb) + free_cb(data); + } +} + void* pa_idxset_rrobin(pa_idxset *s, uint32_t *idx) { unsigned hash; struct idxset_entry *e; diff --git a/src/pulsecore/idxset.h b/src/pulsecore/idxset.h index 0b12ac1b..039e4be1 100644 --- a/src/pulsecore/idxset.h +++ b/src/pulsecore/idxset.h @@ -73,6 +73,9 @@ void* pa_idxset_remove_by_index(pa_idxset*s, uint32_t idx); /* Similar to pa_idxset_get_by_data(), but removes the entry from the idxset */ void* pa_idxset_remove_by_data(pa_idxset*s, const void *p, uint32_t *idx); +/* If free_cb is not NULL, it's called for each entry. */ +void pa_idxset_remove_all(pa_idxset *s, pa_free_cb_t free_cb); + /* This may be used to iterate through all entries. When called with an invalid index value it returns the first entry, otherwise the next following. The function is best called with *idx = diff --git a/src/pulsecore/module.c b/src/pulsecore/module.c index bf554af0..f63c9cdd 100644 --- a/src/pulsecore/module.c +++ b/src/pulsecore/module.c @@ -203,11 +203,9 @@ void pa_module_unload_by_index(pa_core *c, uint32_t idx, pa_bool_t force) { } void pa_module_unload_all(pa_core *c) { - pa_module *m; pa_assert(c); - while ((m = pa_idxset_steal_first(c->modules, NULL))) - pa_module_free(m); + pa_idxset_remove_all(c->modules, (pa_free_cb_t) pa_module_free); if (c->module_defer_unload_event) { c->mainloop->defer_free(c->module_defer_unload_event); diff --git a/src/pulsecore/protocol-dbus.c b/src/pulsecore/protocol-dbus.c index bda23461..17ad902e 100644 --- a/src/pulsecore/protocol-dbus.c +++ b/src/pulsecore/protocol-dbus.c @@ -974,7 +974,6 @@ void pa_dbus_protocol_add_signal_listener( unsigned n_objects) { struct connection_entry *conn_entry = NULL; struct signal_paths_entry *signal_paths_entry = NULL; - char *object_path = NULL; unsigned i = 0; pa_assert(p); @@ -986,8 +985,7 @@ void pa_dbus_protocol_add_signal_listener( /* all_signals_objects will either be emptied or replaced with new objects, * so we empty it here unconditionally. If listening_for_all_signals is * currently FALSE, the idxset is empty already so this does nothing. */ - while ((object_path = pa_idxset_steal_first(conn_entry->all_signals_objects, NULL))) - pa_xfree(object_path); + pa_idxset_remove_all(conn_entry->all_signals_objects, pa_xfree); if (signal_name) { conn_entry->listening_for_all_signals = FALSE; @@ -1029,13 +1027,8 @@ void pa_dbus_protocol_remove_signal_listener(pa_dbus_protocol *p, DBusConnection signal_paths_entry_free(signal_paths_entry); } else { - char *object_path; - conn_entry->listening_for_all_signals = FALSE; - - while ((object_path = pa_idxset_steal_first(conn_entry->all_signals_objects, NULL))) - pa_xfree(object_path); - + pa_idxset_remove_all(conn_entry->all_signals_objects, pa_xfree); pa_hashmap_remove_all(conn_entry->listening_signals, (pa_free_cb_t) signal_paths_entry_free); } } -- 2.39.2