c->deferred_volume_extra_delay_usec = 0;
c->module_defer_unload_event = NULL;
- c->scache_auto_unload_event = NULL;
+ c->modules_pending_unload = pa_hashmap_new(NULL, NULL);
c->subscription_defer_event = NULL;
PA_LLIST_HEAD_INIT(pa_subscription, c->subscriptions);
pa_mempool_set_is_remote_writable(c->rw_mempool, true);
c->exit_event = NULL;
+ c->scache_auto_unload_event = NULL;
c->exit_idle_time = -1;
c->scache_idle_time = 20;
pa_assert(pa_hashmap_isempty(c->shared));
pa_hashmap_free(c->shared);
+ pa_assert(pa_hashmap_isempty(c->modules_pending_unload));
+ pa_hashmap_free(c->modules_pending_unload);
+
pa_subscription_free_all(c);
if (c->exit_event)
int deferred_volume_extra_delay_usec;
pa_defer_event *module_defer_unload_event;
+ pa_hashmap *modules_pending_unload; /* pa_module -> pa_module (hashmap-as-a-set) */
pa_defer_event *subscription_defer_event;
PA_LLIST_HEAD(pa_subscription, subscriptions);
if (m->core->disallow_module_loading && !force)
return;
+ pa_hashmap_remove(c->modules_pending_unload, m);
+
if (!(m = pa_idxset_remove_by_data(c->modules, m, NULL)))
return;
}
static void defer_cb(pa_mainloop_api*api, pa_defer_event *e, void *userdata) {
- void *state = NULL;
pa_core *c = PA_CORE(userdata);
pa_module *m;
pa_core_assert_ref(c);
api->defer_enable(e, 0);
- while ((m = pa_idxset_iterate(c->modules, &state, NULL)))
- if (m->unload_requested)
- pa_module_unload(c, m, true);
+ while ((m = pa_hashmap_first(c->modules_pending_unload)))
+ pa_module_unload(c, m, true);
}
void pa_module_unload_request(pa_module *m, bool force) {
return;
m->unload_requested = true;
+ pa_hashmap_put(m->core->modules_pending_unload, m, m);
if (!m->core->module_defer_unload_event)
m->core->module_defer_unload_event = m->core->mainloop->defer_new(m->core->mainloop, defer_cb, m->core);