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);
u->io_event = NULL;
}
- pa_module_unload_request(u->module);
+ pa_module_unload_request(u->module, TRUE);
}
}
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;
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);
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) {
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);
}
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);
pa_assert_se(pa_close(fd) == 0);
- pa_module_unload_request(m);
+ pa_module_unload_request(m, TRUE);
ret = 0;
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;
u->io = NULL;
}
- pa_module_unload_request(u->module);
+ pa_module_unload_request(u->module, TRUE);
}
}
if (!io) {
pa_log("Connection failed: %s", pa_cstrerror(errno));
- pa_module_unload_request(u->module);
+ pa_module_unload_request(u->module, TRUE);
return;
}
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);
}
}
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 */
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);
}
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)))
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 */
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 */
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 */
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;
}
return;
fail:
- pa_module_unload_request(u->module);
+ pa_module_unload_request(u->module, TRUE);
}
#endif
fail:
- pa_module_unload_request(u->module);
+ pa_module_unload_request(u->module, TRUE);
}
/* Called from main context */
return;
fail:
- pa_module_unload_request(u->module);
+ pa_module_unload_request(u->module, TRUE);
}
#ifdef TUNNEL_SINK
return;
fail:
- pa_module_unload_request(u->module);
+ pa_module_unload_request(u->module, TRUE);
pa_proplist_free(pl);
}
return;
fail:
- pa_module_unload_request(u->module);
+ pa_module_unload_request(u->module, TRUE);
pa_proplist_free(pl);
}
return;
fail:
- pa_module_unload_request(u->module);
+ pa_module_unload_request(u->module, TRUE);
pa_proplist_free(pl);
}
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;
}
pa_log("Invalid reply. (Create stream)");
fail:
- pa_module_unload_request(u->module);
+ pa_module_unload_request(u->module, TRUE);
}
return;
fail:
- pa_module_unload_request(u->module);
+ pa_module_unload_request(u->module, TRUE);
}
/* Called from main context */
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 */
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;
}
}
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;
}
if (!io) {
pa_log("Connection failed: %s", pa_cstrerror(errno));
- pa_module_unload_request(u->module);
+ pa_module_unload_request(u->module, TRUE);
return;
}
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) {
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) {
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) {
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);
}
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);
}
}
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);
}
}
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);
}
}
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);
}
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);
}
}
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);
return -1;
}
- pa_module_unload_request(m);
+ pa_module_unload_request(m, FALSE);
return 0;
}
switch (code) {
case PA_CORE_MESSAGE_UNLOAD_MODULE:
- pa_module_unload(c, userdata);
+ pa_module_unload(c, userdata, TRUE);
return 0;
default:
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)
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;
}
void pa_module_unload_all(pa_core *c) {
-
pa_assert(c);
if (c->modules) {
if (m->last_used_time + m->core->module_idle_time > now)
continue;
- pa_module_unload(c, m);
+ pa_module_unload(c, m, FALSE);
}
}
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)
};
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);
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);
}