From b5c21c1fbc374e95dbee707a59aa213114d114fe Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Mon, 12 Dec 2022 17:11:04 +0100 Subject: [PATCH] pipewire: use dlclose unless PIPEWIRE_DLCLOSE is set to false Always dlclose the libraries but use PIPEWIRE_DLCLOSE to override this behaviour. Fixes #2786 --- Makefile.in | 2 +- src/pipewire/pipewire.c | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Makefile.in b/Makefile.in index e7f44c098..67b199bbc 100644 --- a/Makefile.in +++ b/Makefile.in @@ -38,7 +38,7 @@ gdb: $(MAKE) run DBG=gdb valgrind: - $(MAKE) run DBG="DISABLE_RTKIT=1 valgrind --trace-children=yes" + $(MAKE) run DBG="DISABLE_RTKIT=1 PIPEWIRE_DLCLOSE=false valgrind --trace-children=yes" test: all ninja -C $(BUILD_ROOT) test diff --git a/src/pipewire/pipewire.c b/src/pipewire/pipewire.c index f0629927b..2e146b363 100644 --- a/src/pipewire/pipewire.c +++ b/src/pipewire/pipewire.c @@ -93,6 +93,7 @@ struct support { unsigned int in_valgrind:1; unsigned int no_color:1; unsigned int no_config:1; + unsigned int do_dlclose:1; }; static pthread_mutex_t init_lock = PTHREAD_MUTEX_INITIALIZER; @@ -167,7 +168,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.in_valgrind) + if (global_support.do_dlclose) dlclose(plugin->hnd); free(plugin->filename); free(plugin); @@ -591,6 +592,10 @@ void pw_init(int *argc, char **argv[]) pthread_mutex_lock(&support_lock); support->in_valgrind = RUNNING_ON_VALGRIND; + support->do_dlclose = true; + if ((str = getenv("PIPEWIRE_DLCLOSE")) != NULL) + support->do_dlclose = pw_properties_parse_bool(str); + if (getenv("NO_COLOR") != NULL) support->no_color = true; @@ -821,6 +826,8 @@ bool pw_check_option(const char *option, const char *value) return global_support.no_color == spa_atob(value); else if (spa_streq(option, "no-config")) return global_support.no_config == spa_atob(value); + else if (spa_streq(option, "do-dlclose")) + return global_support.do_dlclose == spa_atob(value); return false; }