From 34dd4a20f2e976b260e8aa3f3128e55ec80bb85b Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 5 Aug 2008 23:56:25 +0200 Subject: fix shutdown when --disallow-module-loading=1 is passed --- src/pulsecore/cli-command.c | 2 +- src/pulsecore/core.c | 2 +- src/pulsecore/module.c | 24 ++++++++++++++---------- src/pulsecore/module.h | 6 +++--- src/pulsecore/protocol-native.c | 2 +- 5 files changed, 20 insertions(+), 16 deletions(-) (limited to 'src/pulsecore') diff --git a/src/pulsecore/cli-command.c b/src/pulsecore/cli-command.c index 0bd4070c..8e8f5f28 100644 --- a/src/pulsecore/cli-command.c +++ b/src/pulsecore/cli-command.c @@ -415,7 +415,7 @@ static int pa_cli_command_unload(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, pa return -1; } - pa_module_unload_request(m); + pa_module_unload_request(m, FALSE); return 0; } diff --git a/src/pulsecore/core.c b/src/pulsecore/core.c index aa8de8df..5e40ea88 100644 --- a/src/pulsecore/core.c +++ b/src/pulsecore/core.c @@ -56,7 +56,7 @@ static int core_process_msg(pa_msgobject *o, int code, void *userdata, int64_t o switch (code) { case PA_CORE_MESSAGE_UNLOAD_MODULE: - pa_module_unload(c, userdata); + pa_module_unload(c, userdata, TRUE); return 0; default: diff --git a/src/pulsecore/module.c b/src/pulsecore/module.c index edd0b0a7..dbafa8c9 100644 --- a/src/pulsecore/module.c +++ b/src/pulsecore/module.c @@ -156,9 +156,6 @@ static void pa_module_free(pa_module *m) { pa_assert(m); pa_assert(m->core); - if (m->core->disallow_module_loading) - return; - pa_log_info("Unloading \"%s\" (index: #%u).", m->name, m->index); if (m->done) @@ -175,22 +172,27 @@ static void pa_module_free(pa_module *m) { pa_xfree(m); } -void pa_module_unload(pa_core *c, pa_module *m) { +void pa_module_unload(pa_core *c, pa_module *m, pa_bool_t force) { pa_assert(c); pa_assert(m); - pa_assert(c->modules); + if (m->core->disallow_module_loading && !force) + return; + if (!(m = pa_idxset_remove_by_data(c->modules, m, NULL))) return; pa_module_free(m); } -void pa_module_unload_by_index(pa_core *c, uint32_t idx) { +void pa_module_unload_by_index(pa_core *c, uint32_t idx, pa_bool_t force) { pa_module *m; pa_assert(c); pa_assert(idx != PA_IDXSET_INVALID); + if (m->core->disallow_module_loading && !force) + return; + if (!(m = pa_idxset_remove_by_index(c->modules, idx))) return; @@ -198,7 +200,6 @@ void pa_module_unload_by_index(pa_core *c, uint32_t idx) { } void pa_module_unload_all(pa_core *c) { - pa_assert(c); if (c->modules) { @@ -245,7 +246,7 @@ void pa_module_unload_unused(pa_core *c) { if (m->last_used_time + m->core->module_idle_time > now) continue; - pa_module_unload(c, m); + pa_module_unload(c, m, FALSE); } } @@ -262,12 +263,15 @@ static void defer_cb(pa_mainloop_api*api, pa_defer_event *e, void *userdata) { while ((m = pa_idxset_iterate(c->modules, &state, NULL))) if (m->unload_requested) - pa_module_unload(c, m); + pa_module_unload(c, m, TRUE); } -void pa_module_unload_request(pa_module *m) { +void pa_module_unload_request(pa_module *m, pa_bool_t force) { pa_assert(m); + if (m->core->disallow_module_loading && !force) + return; + m->unload_requested = TRUE; if (!m->core->module_defer_unload_event) diff --git a/src/pulsecore/module.h b/src/pulsecore/module.h index bb3a3f57..365ab67e 100644 --- a/src/pulsecore/module.h +++ b/src/pulsecore/module.h @@ -52,13 +52,13 @@ struct pa_module { }; pa_module* pa_module_load(pa_core *c, const char *name, const char*argument); -void pa_module_unload(pa_core *c, pa_module *m); -void pa_module_unload_by_index(pa_core *c, uint32_t idx); +void pa_module_unload(pa_core *c, pa_module *m, pa_bool_t force); +void pa_module_unload_by_index(pa_core *c, uint32_t idx, pa_bool_t force); void pa_module_unload_all(pa_core *c); void pa_module_unload_unused(pa_core *c); -void pa_module_unload_request(pa_module *m); +void pa_module_unload_request(pa_module *m, pa_bool_t force); void pa_module_set_used(pa_module*m, int used); diff --git a/src/pulsecore/protocol-native.c b/src/pulsecore/protocol-native.c index 3c3c1e5f..9378477b 100644 --- a/src/pulsecore/protocol-native.c +++ b/src/pulsecore/protocol-native.c @@ -3568,7 +3568,7 @@ static void command_unload_module(PA_GCC_UNUSED pa_pdispatch *pd, PA_GCC_UNUSED m = pa_idxset_get_by_index(c->protocol->core->modules, idx); CHECK_VALIDITY(c->pstream, m, tag, PA_ERR_NOENTITY); - pa_module_unload_request(m); + pa_module_unload_request(m, FALSE); pa_pstream_send_simple_ack(c->pstream, tag); } -- cgit