summaryrefslogtreecommitdiffstats
path: root/src/pulsecore
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2008-08-05 23:56:25 +0200
committerLennart Poettering <lennart@poettering.net>2008-08-05 23:56:25 +0200
commit34dd4a20f2e976b260e8aa3f3128e55ec80bb85b (patch)
tree7dbb7baff0336d98fcd81cdf330a6d8015963ef6 /src/pulsecore
parentca127532fcddd28cc40bbbe0646a1205b365ffb7 (diff)
fix shutdown when --disallow-module-loading=1 is passed
Diffstat (limited to 'src/pulsecore')
-rw-r--r--src/pulsecore/cli-command.c2
-rw-r--r--src/pulsecore/core.c2
-rw-r--r--src/pulsecore/module.c24
-rw-r--r--src/pulsecore/module.h6
-rw-r--r--src/pulsecore/protocol-native.c2
5 files changed, 20 insertions, 16 deletions
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);
}