]> code.delx.au - pulseaudio/commitdiff
fix shutdown when --disallow-module-loading=1 is passed
authorLennart Poettering <lennart@poettering.net>
Tue, 5 Aug 2008 21:56:25 +0000 (23:56 +0200)
committerLennart Poettering <lennart@poettering.net>
Tue, 5 Aug 2008 21:56:25 +0000 (23:56 +0200)
26 files changed:
src/modules/gconf/module-gconf.c
src/modules/module-always-sink.c
src/modules/module-cli.c
src/modules/module-combine.c
src/modules/module-detect.c
src/modules/module-esound-compat-spawnfd.c
src/modules/module-esound-compat-spawnpid.c
src/modules/module-esound-sink.c
src/modules/module-hal-detect.c
src/modules/module-ladspa-sink.c
src/modules/module-lirc.c
src/modules/module-mmkbd-evdev.c
src/modules/module-remap-sink.c
src/modules/module-sine.c
src/modules/module-tunnel.c
src/modules/module-x11-bell.c
src/modules/module-x11-publish.c
src/modules/module-x11-xsmp.c
src/modules/module-zeroconf-discover.c
src/modules/module-zeroconf-publish.c
src/modules/rtp/module-rtp-send.c
src/pulsecore/cli-command.c
src/pulsecore/core.c
src/pulsecore/module.c
src/pulsecore/module.h
src/pulsecore/protocol-native.c

index a2a43278c17a87a5409c6b48ff464456262df775..e2b0f7c00b9be3cf4954068caf5692a8a215f6ce 100644 (file)
@@ -142,7 +142,7 @@ static void unload_one_module(struct userdata *u, struct module_info*m, unsigned
         return;
 
     pa_log_debug("Unloading module #%i", m->items[i].index);
-    pa_module_unload_by_index(u->core, m->items[i].index);
+    pa_module_unload_by_index(u->core, m->items[i].index, TRUE);
     m->items[i].index = PA_INVALID_INDEX;
     pa_xfree(m->items[i].name);
     pa_xfree(m->items[i].args);
@@ -324,7 +324,7 @@ static void io_event_cb(
             u->io_event = NULL;
         }
 
-        pa_module_unload_request(u->module);
+        pa_module_unload_request(u->module, TRUE);
     }
 }
 
index 8b67a36dc40830c3e989d5bc7a3ad941d2414ca9..9d60c29e39ea5889f58bfb13f8e70afdf40e6e78 100644 (file)
@@ -108,7 +108,7 @@ static pa_hook_result_t put_hook_callback(pa_core *c, pa_sink *sink, void* userd
 
     pa_log_info("A new sink has been discovered. Unloading null-sink.");
 
-    pa_module_unload_request(u->null_module);
+    pa_module_unload_request(u->null_module, TRUE);
     u->null_module = NULL;
 
     return PA_HOOK_OK;
@@ -171,7 +171,7 @@ void pa__done(pa_module*m) {
     if (u->unlink_slot)
         pa_hook_slot_free(u->unlink_slot);
     if (u->null_module)
-        pa_module_unload_request(u->null_module);
+        pa_module_unload_request(u->null_module, TRUE);
 
     pa_xfree(u->sink_name);
     pa_xfree(u);
index df7783fa73af58dced6d817bbb4f11594f70e42a..7a58877a190946d8a6a6a4351ffd62eaaea64783 100644 (file)
@@ -53,7 +53,7 @@ static void eof_and_unload_cb(pa_cli*c, void *userdata) {
     pa_assert(c);
     pa_assert(m);
 
-    pa_module_unload_request(m);
+    pa_module_unload_request(m, TRUE);
 }
 
 static void eof_and_exit_cb(pa_cli*c, void *userdata) {
index 0a0b8d209d2c0ee59cb38a9c5878182e9b2146cf..1bfe4b4c6df1f63e26200d46a8eaebfc594e2cdb 100644 (file)
@@ -489,7 +489,7 @@ static void sink_input_kill_cb(pa_sink_input *i) {
     pa_sink_input_assert_ref(i);
     pa_assert(o = i->userdata);
 
-    pa_module_unload_request(o->userdata->module);
+    pa_module_unload_request(o->userdata->module, TRUE);
     output_free(o);
 }
 
index 13bcfcd142d0392948729dbbaca4c12544805b09..09b720df0d36d5a8c936cf29043bb0c8ad7fb34b 100644 (file)
@@ -256,7 +256,7 @@ int pa__init(pa_module*m) {
     pa_log_info("loaded %i modules.", n);
 
     /* We were successful and can unload ourselves now. */
-    pa_module_unload_request(m);
+    pa_module_unload_request(m, TRUE);
 
     pa_modargs_free(ma);
 
index 8eb4985b2bbcf4d861c81e04ec0e0157758d0a00..578ad3b5025c61f417808680007997cb45cab973 100644 (file)
@@ -66,7 +66,7 @@ int pa__init(pa_module*m) {
 
     pa_assert_se(pa_close(fd) == 0);
 
-    pa_module_unload_request(m);
+    pa_module_unload_request(m, TRUE);
 
     ret = 0;
 
index 67f0a2312a31e219ea1f418db69e23797a6dd8b9..f75335d57ac0b90677bc034f2bf291be6bb896f2 100644 (file)
@@ -65,7 +65,7 @@ int pa__init(pa_module*m) {
     if (kill(pid, SIGUSR1) < 0)
         pa_log_warn("kill(%u) failed: %s", pid, pa_cstrerror(errno));
 
-    pa_module_unload_request(m);
+    pa_module_unload_request(m, TRUE);
 
     ret = 0;
 
index 6ca6497825fcc2d3be33f89ec33bb7b9d182c8ec..f748808e2032b560653624c90ce6479e56e63ccc 100644 (file)
@@ -479,7 +479,7 @@ static void io_callback(PA_GCC_UNUSED pa_iochannel *io, void*userdata) {
             u->io = NULL;
         }
 
-       pa_module_unload_request(u->module);
+        pa_module_unload_request(u->module, TRUE);
     }
 }
 
@@ -491,7 +491,7 @@ static void on_connection(PA_GCC_UNUSED pa_socket_client *c, pa_iochannel*io, vo
 
     if (!io) {
         pa_log("Connection failed: %s", pa_cstrerror(errno));
-        pa_module_unload_request(u->module);
+        pa_module_unload_request(u->module, TRUE);
         return;
     }
 
index bfabd91a7c0b1823c8867759771b1f8cffc859ef..caa7a1fa4e70d384e8021090735f66da4d72d40b 100644 (file)
@@ -511,7 +511,7 @@ static void device_removed_cb(LibHalContext* context, const char *udi) {
     pa_log_debug("Device removed: %s", udi);
 
     if ((d = pa_hashmap_remove(u->devices, udi))) {
-        pa_module_unload_by_index(u->core, d->index);
+        pa_module_unload_by_index(u->core, d->index, TRUE);
         hal_device_free(d);
     }
 }
index eae80086c45974bbaabf213c0dd706da9ab37985..23eeb340e0dd40aa4cefa14d1ff88e8d0f93cf88 100644 (file)
@@ -340,7 +340,7 @@ static void sink_input_kill_cb(pa_sink_input *i) {
     pa_sink_input_unref(u->sink_input);
     u->sink_input = NULL;
 
-    pa_module_unload_request(u->module);
+    pa_module_unload_request(u->module, TRUE);
 }
 
 /* Called from IO thread context */
index 0570a6a11e57c2f84d72a05f483ade1ba5b5401a..f34f7be32e7ee32f66c787a0783b55526f746fdb 100644 (file)
@@ -178,7 +178,7 @@ fail:
     u->module->core->mainloop->io_free(u->io);
     u->io = NULL;
 
-    pa_module_unload_request(u->module);
+    pa_module_unload_request(u->module, TRUE);
 
     pa_xfree(code);
 }
index 4388e49c8170535e70db5c29c5e3eacb07ec1810..7da77c0de0bf996d4c0ab97fcb97ce0d116814ea 100644 (file)
@@ -159,7 +159,7 @@ fail:
     u->module->core->mainloop->io_free(u->io);
     u->io = NULL;
 
-    pa_module_unload_request(u->module);
+    pa_module_unload_request(u->module, TRUE);
 }
 
 #define test_bit(bit, array) (array[bit/8] & (1<<(bit%8)))
index bd86f4d677253f7ea1d412452994313a2e0299d1..5b2be118e594223d20f9d2d03bbf7d4bee508a3f 100644 (file)
@@ -255,7 +255,7 @@ static void sink_input_kill_cb(pa_sink_input *i) {
     pa_sink_input_unref(u->sink_input);
     u->sink_input = NULL;
 
-    pa_module_unload_request(u->module);
+    pa_module_unload_request(u->module, TRUE);
 }
 
 /* Called from IO thread context */
index 38780f2472a3279769571614aae81bc071956864..a6324526c7ce829d91544acea6f7e30fdf65d993 100644 (file)
@@ -99,7 +99,7 @@ static void sink_input_kill_cb(pa_sink_input *i) {
     pa_sink_input_unref(u->sink_input);
     u->sink_input = NULL;
 
-    pa_module_unload_request(u->module);
+    pa_module_unload_request(u->module, TRUE);
 }
 
 /* Called from IO thread context */
index af27ce7446b536f121ca442618ea114db1aa00af..79ce1dd261713e5886f7bbb9bcd77a8d2f000e1f 100644 (file)
@@ -231,7 +231,7 @@ static void command_stream_killed(pa_pdispatch *pd,  uint32_t command,  uint32_t
     pa_assert(u->pdispatch == pd);
 
     pa_log_warn("Stream killed");
-    pa_module_unload_request(u->module);
+    pa_module_unload_request(u->module, TRUE);
 }
 
 /* Called from main context */
@@ -262,7 +262,7 @@ static void command_suspended(pa_pdispatch *pd,  uint32_t command,  uint32_t tag
         pa_tagstruct_get_boolean(t, &suspended) < 0 ||
         !pa_tagstruct_eof(t)) {
         pa_log("Invalid packet");
-        pa_module_unload_request(u->module);
+        pa_module_unload_request(u->module, TRUE);
         return;
     }
 
@@ -652,7 +652,7 @@ static void command_request(pa_pdispatch *pd, uint32_t command,  uint32_t tag, p
     return;
 
 fail:
-    pa_module_unload_request(u->module);
+    pa_module_unload_request(u->module, TRUE);
 }
 
 #endif
@@ -765,7 +765,7 @@ static void stream_get_latency_callback(pa_pdispatch *pd, uint32_t command, uint
 
 fail:
 
-    pa_module_unload_request(u->module);
+    pa_module_unload_request(u->module, TRUE);
 }
 
 /* Called from main context */
@@ -902,7 +902,7 @@ static void server_info_cb(pa_pdispatch *pd, uint32_t command,  uint32_t tag, pa
     return;
 
 fail:
-    pa_module_unload_request(u->module);
+    pa_module_unload_request(u->module, TRUE);
 }
 
 #ifdef TUNNEL_SINK
@@ -979,7 +979,7 @@ static void sink_info_cb(pa_pdispatch *pd, uint32_t command,  uint32_t tag, pa_t
     return;
 
 fail:
-    pa_module_unload_request(u->module);
+    pa_module_unload_request(u->module, TRUE);
     pa_proplist_free(pl);
 }
 
@@ -1066,7 +1066,7 @@ static void sink_input_info_cb(pa_pdispatch *pd, uint32_t command,  uint32_t tag
     return;
 
 fail:
-    pa_module_unload_request(u->module);
+    pa_module_unload_request(u->module, TRUE);
     pa_proplist_free(pl);
 }
 
@@ -1142,7 +1142,7 @@ static void source_info_cb(pa_pdispatch *pd, uint32_t command,  uint32_t tag, pa
     return;
 
 fail:
-    pa_module_unload_request(u->module);
+    pa_module_unload_request(u->module, TRUE);
     pa_proplist_free(pl);
 }
 
@@ -1204,7 +1204,7 @@ static void command_subscribe_event(pa_pdispatch *pd,  uint32_t command,  uint32
     if (pa_tagstruct_getu32(t, &e) < 0 ||
         pa_tagstruct_getu32(t, &idx) < 0) {
         pa_log("Invalid protocol reply");
-        pa_module_unload_request(u->module);
+        pa_module_unload_request(u->module, TRUE);
         return;
     }
 
@@ -1344,7 +1344,7 @@ parse_error:
     pa_log("Invalid reply. (Create stream)");
 
 fail:
-    pa_module_unload_request(u->module);
+    pa_module_unload_request(u->module, TRUE);
 
 }
 
@@ -1502,7 +1502,7 @@ static void setup_complete_callback(pa_pdispatch *pd, uint32_t command, uint32_t
     return;
 
 fail:
-    pa_module_unload_request(u->module);
+    pa_module_unload_request(u->module, TRUE);
 }
 
 /* Called from main context */
@@ -1513,7 +1513,7 @@ static void pstream_die_callback(pa_pstream *p, void *userdata) {
     pa_assert(u);
 
     pa_log_warn("Stream died.");
-    pa_module_unload_request(u->module);
+    pa_module_unload_request(u->module, TRUE);
 }
 
 /* Called from main context */
@@ -1526,7 +1526,7 @@ static void pstream_packet_callback(pa_pstream *p, pa_packet *packet, const pa_c
 
     if (pa_pdispatch_run(u->pdispatch, packet, creds, u) < 0) {
         pa_log("Invalid packet");
-        pa_module_unload_request(u->module);
+        pa_module_unload_request(u->module, TRUE);
         return;
     }
 }
@@ -1542,7 +1542,7 @@ static void pstream_memblock_callback(pa_pstream *p, uint32_t channel, int64_t o
 
     if (channel != u->channel) {
         pa_log("Recieved memory block on bad channel.");
-        pa_module_unload_request(u->module);
+        pa_module_unload_request(u->module, TRUE);
         return;
     }
 
@@ -1568,7 +1568,7 @@ static void on_connection(pa_socket_client *sc, pa_iochannel *io, void *userdata
 
     if (!io) {
         pa_log("Connection failed: %s", pa_cstrerror(errno));
-        pa_module_unload_request(u->module);
+        pa_module_unload_request(u->module, TRUE);
         return;
     }
 
index f7be48f7bd3a51bdaa3ed35a096a7c061cf30b55..ae16b9ae1733bc62f239ab1caab0a430d20372f7 100644 (file)
@@ -106,7 +106,7 @@ static void x11_kill_cb(pa_x11_wrapper *w, void *userdata) {
     u->x11_client = NULL;
     u->x11_wrapper = NULL;
 
-    pa_module_unload_request(u->module);
+    pa_module_unload_request(u->module, TRUE);
 }
 
 int pa__init(pa_module*m) {
index 1dbc939d3b60677988394afbb15cd00e7fe23e12..c6c5bacde864cf96115af87a2780d129f054076d 100644 (file)
@@ -126,7 +126,7 @@ static void x11_kill_cb(pa_x11_wrapper *w, void *userdata) {
     u->x11_client = NULL;
     u->x11_wrapper = NULL;
 
-    pa_module_unload_request(u->module);
+    pa_module_unload_request(u->module, TRUE);
 }
 
 int pa__init(pa_module*m) {
index 0b2e375ab9886573a60f7c0882b216ea190fa81d..12e100b7d91930441a0f93908db9950002c0d0d1 100644 (file)
@@ -77,7 +77,7 @@ static void die_cb(SmcConn connection, SmPointer client_data){
     pa_x11_wrapper_unref(u->x11);
     u->x11 = NULL;
 
-    pa_module_unload_request(u->module);
+    pa_module_unload_request(u->module, TRUE);
 }
 
 static void save_complete_cb(SmcConn connection, SmPointer client_data) {
index 2fc81370a2d68e80515b0153c1e9948b2dfc3d1b..a4fbf020b64175878016a6a6d49b8ab1928affd1 100644 (file)
@@ -286,7 +286,7 @@ static void browser_cb(
         struct tunnel *t2;
 
         if ((t2 = pa_hashmap_get(u->tunnels, t))) {
-            pa_module_unload_by_index(u->core, t2->module_index);
+            pa_module_unload_by_index(u->core, t2->module_index, TRUE);
             pa_hashmap_remove(u->tunnels, t2);
             tunnel_free(t2);
         }
@@ -319,7 +319,7 @@ static void client_callback(AvahiClient *c, AvahiClientState state, void *userda
                               browser_cb, u))) {
 
                     pa_log("avahi_service_browser_new() failed: %s", avahi_strerror(avahi_client_errno(c)));
-                    pa_module_unload_request(u->module);
+                    pa_module_unload_request(u->module, TRUE);
                 }
             }
 
@@ -334,7 +334,7 @@ static void client_callback(AvahiClient *c, AvahiClientState state, void *userda
                               browser_cb, u))) {
 
                     pa_log("avahi_service_browser_new() failed: %s", avahi_strerror(avahi_client_errno(c)));
-                    pa_module_unload_request(u->module);
+                    pa_module_unload_request(u->module, TRUE);
                 }
             }
 
@@ -348,7 +348,7 @@ static void client_callback(AvahiClient *c, AvahiClientState state, void *userda
 
                 if (!(u->client = avahi_client_new(u->avahi_poll, AVAHI_CLIENT_NO_FAIL, client_callback, u, &error))) {
                     pa_log("avahi_client_new() failed: %s", avahi_strerror(error));
-                    pa_module_unload_request(u->module);
+                    pa_module_unload_request(u->module, TRUE);
                 }
             }
 
@@ -427,7 +427,7 @@ void pa__done(pa_module*m) {
         struct tunnel *t;
 
         while ((t = pa_hashmap_steal_first(u->tunnels))) {
-            pa_module_unload_by_index(u->core, t->module_index);
+            pa_module_unload_by_index(u->core, t->module_index, TRUE);
             tunnel_free(t);
         }
 
index 789291791b102e057ca837372b8296535a27353c..985564f4c80c5b40570e14753461a5997b94bf5f 100644 (file)
@@ -539,7 +539,7 @@ static void client_callback(AvahiClient *c, AvahiClientState state, void *userda
 
                 if (!(u->client = avahi_client_new(u->avahi_poll, AVAHI_CLIENT_NO_FAIL, client_callback, u, &error))) {
                     pa_log("avahi_client_new() failed: %s", avahi_strerror(error));
-                    pa_module_unload_request(u->module);
+                    pa_module_unload_request(u->module, TRUE);
                 }
             }
 
index d0d06c4d48fb4865f32a05214ac1121a8372ae66..5e542253421ce81b50ac320db9078ea93fd62ef7 100644 (file)
@@ -139,7 +139,7 @@ static void source_output_kill(pa_source_output* o) {
     pa_source_output_assert_ref(o);
     pa_assert_se(u = o->userdata);
 
-    pa_module_unload_request(u->module);
+    pa_module_unload_request(u->module, TRUE);
 
     pa_source_output_unlink(u->source_output);
     pa_source_output_unref(u->source_output);
index 0bd4070c7942bb7a2b88c64c4fff2cc94d821d8d..8e8f5f284648700378ee770747983e6f2bcf4617 100644 (file)
@@ -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;
 }
 
index aa8de8dfd642a4a3b946382086fe4a348ba1360a..5e40ea882068524923a2e36de63c0ffd2061d38b 100644 (file)
@@ -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:
index edd0b0a773c25ba4e8802c8c0a121e16ed2ff864..dbafa8c9641d7a5d2785a859118821a81898410b 100644 (file)
@@ -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)
index bb3a3f57c9f1901afc957666dbb49598d02a5c2f..365ab67e5bdd9def6e023f05b8ca904b4338a9df 100644 (file)
@@ -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);
 
index 3c3c1e5f292ee67708dd5d282d954cc2742b65d5..9378477b4fbaf28e85bca8b6773efad1355f04dc 100644 (file)
@@ -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);
 }