From 0e75b3fa0f6865d437a7c6bd11c045285a7ed607 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Barnab=C3=A1s=20P=C5=91cze?= Date: Fri, 12 Nov 2021 18:54:17 +0100 Subject: [PATCH] pulse-server: handle if the module is destroyed while loading Create a new event for modules ('destroy') which is emitted from `module_free()`. It is used by the module loading logic, to handle when a module is destroyed without properly loading first. --- src/modules/module-protocol-pulse/module.c | 2 ++ src/modules/module-protocol-pulse/module.h | 2 ++ src/modules/module-protocol-pulse/pulse-server.c | 6 ++++++ 3 files changed, 10 insertions(+) diff --git a/src/modules/module-protocol-pulse/module.c b/src/modules/module-protocol-pulse/module.c index 2a2434b22..820a0dbed 100644 --- a/src/modules/module-protocol-pulse/module.c +++ b/src/modules/module-protocol-pulse/module.c @@ -92,6 +92,8 @@ void module_free(struct module *module) { struct impl *impl = module->impl; + module_emit_destroy(module); + if (module->idx != SPA_ID_INVALID) pw_map_remove(&impl->modules, module->idx & INDEX_MASK); diff --git a/src/modules/module-protocol-pulse/module.h b/src/modules/module-protocol-pulse/module.h index 4d0e604f9..b5ec49df4 100644 --- a/src/modules/module-protocol-pulse/module.h +++ b/src/modules/module-protocol-pulse/module.h @@ -45,6 +45,7 @@ struct module_events { uint32_t version; void (*loaded) (void *data, int result); + void (*destroy) (void *data); }; struct module_methods { @@ -68,6 +69,7 @@ struct module { }; #define module_emit_loaded(m,r) spa_hook_list_call(&m->listener_list, struct module_events, loaded, 0, r) +#define module_emit_destroy(m) spa_hook_list_call(&(m)->listener_list, struct module_events, destroy, 0) struct module *module_create(struct client *client, const char *name, const char *args); void module_free(struct module *module); diff --git a/src/modules/module-protocol-pulse/pulse-server.c b/src/modules/module-protocol-pulse/pulse-server.c index 456514137..9fa0f2098 100644 --- a/src/modules/module-protocol-pulse/pulse-server.c +++ b/src/modules/module-protocol-pulse/pulse-server.c @@ -4666,6 +4666,11 @@ static void on_module_loaded(void *data, int result) free(pm); } +static void on_module_destroy(void *data) +{ + on_module_loaded(data, -ECANCELED); +} + static void on_client_disconnect(void *data) { struct pending_module *pm = data; @@ -4679,6 +4684,7 @@ static int do_load_module(struct client *client, uint32_t command, uint32_t tag, static const struct module_events module_events = { VERSION_MODULE_EVENTS, .loaded = on_module_loaded, + .destroy = on_module_destroy, }; static const struct client_events client_events = { VERSION_CLIENT_EVENTS,