From 3deaa2b0dfa8b82538f7943c32fd714ffd766596 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Barnab=C3=A1s=20P=C5=91cze?= Date: Wed, 22 Nov 2023 22:47:56 +0100 Subject: [PATCH] pipewire: impl-module: respect `PIPEWIRE_DLCLOSE` Commit b5c21c1fbc374e ("pipewire: use dlclose unless PIPEWIRE_DLCLOSE is set to false") introduced the PIPEWIRE_DLCLOSE environmental variable to force/prevent the dlclose()ing of shared objects. However, native pipewire modules were not adjusted to respect its value, and instead have been still using `pw_in_valgrind()` to determine whether or not they should be unloaded. Fix that by adding a private `pw_should_dlclose()` function and using that in impl-module.c:pw_impl_module_destroy(). --- src/pipewire/impl-module.c | 2 +- src/pipewire/pipewire.c | 8 +++++++- src/pipewire/private.h | 2 ++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/pipewire/impl-module.c b/src/pipewire/impl-module.c index 23df06cca..561f05c72 100644 --- a/src/pipewire/impl-module.c +++ b/src/pipewire/impl-module.c @@ -323,7 +323,7 @@ void pw_impl_module_destroy(struct pw_impl_module *module) pw_work_queue_cancel(pw_context_get_work_queue(module->context), module, SPA_ID_INVALID); - if (!pw_in_valgrind() && dlclose(impl->hnd) != 0) + if (pw_should_dlclose() && dlclose(impl->hnd) != 0) pw_log_warn("%p: dlclose failed: %s", module, dlerror()); free(impl); } diff --git a/src/pipewire/pipewire.c b/src/pipewire/pipewire.c index ada0d13be..5008164ea 100644 --- a/src/pipewire/pipewire.c +++ b/src/pipewire/pipewire.c @@ -149,7 +149,7 @@ unref_plugin(struct plugin *plugin) if (--plugin->ref == 0) { spa_list_remove(&plugin->link); pw_log_debug("unloaded plugin:'%s'", plugin->filename); - if (global_support.do_dlclose) + if (pw_should_dlclose()) dlclose(plugin->hnd); free(plugin->filename); free(plugin); @@ -791,6 +791,12 @@ bool pw_in_valgrind(void) return global_support.in_valgrind; } +bool +pw_should_dlclose(void) +{ + return global_support.do_dlclose; +} + SPA_EXPORT bool pw_check_option(const char *option, const char *value) { diff --git a/src/pipewire/private.h b/src/pipewire/private.h index 58b2b6085..021a5d5f9 100644 --- a/src/pipewire/private.h +++ b/src/pipewire/private.h @@ -1292,6 +1292,8 @@ void pw_settings_init(struct pw_context *context); int pw_settings_expose(struct pw_context *context); void pw_settings_clean(struct pw_context *context); +bool pw_should_dlclose(void); + /** \endcond */ #ifdef __cplusplus