From e0c01b9802f3e2691e99106d4fccda15562bb357 Mon Sep 17 00:00:00 2001 From: Mirko Bonadei Date: Fri, 14 Sep 2018 09:52:46 +0200 Subject: [PATCH] Fix global_constructors, exit_time_destructors in audio device pulse. Bug: webrtc:9693 Change-Id: I05498473be8a86756d65d0b9000d626c966d4ed3 Reviewed-on: https://webrtc-review.googlesource.com/100422 Reviewed-by: Henrik Andreassson Commit-Queue: Mirko Bonadei Cr-Commit-Position: refs/heads/master@{#24865} --- modules/audio_device/BUILD.gn | 4 ---- .../linux/audio_device_alsa_linux.cc | 7 +++++++ .../audio_device/linux/audio_device_alsa_linux.h | 7 ------- .../linux/audio_device_pulse_linux.cc | 16 ++++++++++------ .../linux/audio_device_pulse_linux.h | 3 +++ .../linux/audio_mixer_manager_alsa_linux.cc | 7 +++++++ .../linux/audio_mixer_manager_pulse_linux.cc | 13 ++++++------- 7 files changed, 33 insertions(+), 24 deletions(-) diff --git a/modules/audio_device/BUILD.gn b/modules/audio_device/BUILD.gn index 70c9c0af6c..2759da4843 100644 --- a/modules/audio_device/BUILD.gn +++ b/modules/audio_device/BUILD.gn @@ -321,10 +321,6 @@ rtc_source_set("audio_device_impl") { defines += [ "WEBRTC_USE_X11" ] } if (rtc_include_pulse_audio) { - configs += [ - "../..:no_exit_time_destructors", - "../..:no_global_constructors", - ] sources += [ "linux/audio_device_pulse_linux.cc", "linux/audio_device_pulse_linux.h", diff --git a/modules/audio_device/linux/audio_device_alsa_linux.cc b/modules/audio_device/linux/audio_device_alsa_linux.cc index e6cfcb8d8d..bef4ef3564 100644 --- a/modules/audio_device/linux/audio_device_alsa_linux.cc +++ b/modules/audio_device/linux/audio_device_alsa_linux.cc @@ -22,6 +22,13 @@ WebRTCAlsaSymbolTable* GetAlsaSymbolTable() { return alsa_symbol_table; } +// Accesses ALSA functions through our late-binding symbol table instead of +// directly. This way we don't have to link to libasound, which means our binary +// will work on systems that don't have it. +#define LATE(sym) \ + LATESYM_GET(webrtc::adm_linux_alsa::AlsaSymbolTable, GetAlsaSymbolTable(), \ + sym) + // Redefine these here to be able to do late-binding #undef snd_ctl_card_info_alloca #define snd_ctl_card_info_alloca(ptr) \ diff --git a/modules/audio_device/linux/audio_device_alsa_linux.h b/modules/audio_device/linux/audio_device_alsa_linux.h index 1c78ef115d..3d15565b8d 100644 --- a/modules/audio_device/linux/audio_device_alsa_linux.h +++ b/modules/audio_device/linux/audio_device_alsa_linux.h @@ -28,13 +28,6 @@ typedef webrtc::adm_linux_alsa::AlsaSymbolTable WebRTCAlsaSymbolTable; WebRTCAlsaSymbolTable* GetAlsaSymbolTable(); -// Accesses ALSA functions through our late-binding symbol table instead of -// directly. This way we don't have to link to libasound, which means our binary -// will work on systems that don't have it. -#define LATE(sym) \ - LATESYM_GET(webrtc::adm_linux_alsa::AlsaSymbolTable, GetAlsaSymbolTable(), \ - sym) - namespace webrtc { class EventWrapper; diff --git a/modules/audio_device/linux/audio_device_pulse_linux.cc b/modules/audio_device/linux/audio_device_pulse_linux.cc index 2f343bae06..153104967b 100644 --- a/modules/audio_device/linux/audio_device_pulse_linux.cc +++ b/modules/audio_device/linux/audio_device_pulse_linux.cc @@ -16,14 +16,18 @@ #include "rtc_base/logging.h" #include "system_wrappers/include/event_wrapper.h" -webrtc::adm_linux_pulse::PulseAudioSymbolTable PaSymbolTable; +WebRTCPulseSymbolTable* GetPulseSymbolTable() { + static WebRTCPulseSymbolTable* pulse_symbol_table = + new WebRTCPulseSymbolTable(); + return pulse_symbol_table; +} // Accesses Pulse functions through our late-binding symbol table instead of // directly. This way we don't have to link to libpulse, which means our binary // will work on systems that don't have it. -#define LATE(sym) \ - LATESYM_GET(webrtc::adm_linux_pulse::PulseAudioSymbolTable, &PaSymbolTable, \ - sym) +#define LATE(sym) \ + LATESYM_GET(webrtc::adm_linux_pulse::PulseAudioSymbolTable, \ + GetPulseSymbolTable(), sym) namespace webrtc { @@ -1547,7 +1551,7 @@ int32_t AudioDeviceLinuxPulse::InitPulseAudio() { int retVal = 0; // Load libpulse - if (!PaSymbolTable.Load()) { + if (!GetPulseSymbolTable()->Load()) { // Most likely the Pulse library and sound server are not installed on // this system RTC_LOG(LS_ERROR) << "failed to load symbol table"; @@ -1658,7 +1662,7 @@ int32_t AudioDeviceLinuxPulse::InitPulseAudio() { int32_t AudioDeviceLinuxPulse::TerminatePulseAudio() { // Do nothing if the instance doesn't exist - // likely PaSymbolTable.Load() fails + // likely GetPulseSymbolTable.Load() fails if (!_paMainloop) { return 0; } diff --git a/modules/audio_device/linux/audio_device_pulse_linux.h b/modules/audio_device/linux/audio_device_pulse_linux.h index 854c7c6f2f..1655b18117 100644 --- a/modules/audio_device/linux/audio_device_pulse_linux.h +++ b/modules/audio_device/linux/audio_device_pulse_linux.h @@ -92,6 +92,9 @@ const int32_t WEBRTC_PA_NO_LATENCY_REQUIREMENTS = -1; // calculation const uint32_t WEBRTC_PA_CAPTURE_BUFFER_LATENCY_ADJUSTMENT = 0; +typedef webrtc::adm_linux_pulse::PulseAudioSymbolTable WebRTCPulseSymbolTable; +WebRTCPulseSymbolTable* GetPulseSymbolTable(); + namespace webrtc { class EventWrapper; diff --git a/modules/audio_device/linux/audio_mixer_manager_alsa_linux.cc b/modules/audio_device/linux/audio_mixer_manager_alsa_linux.cc index 7701364a3e..122944e650 100644 --- a/modules/audio_device/linux/audio_mixer_manager_alsa_linux.cc +++ b/modules/audio_device/linux/audio_mixer_manager_alsa_linux.cc @@ -14,6 +14,13 @@ #include "modules/audio_device/linux/audio_mixer_manager_alsa_linux.h" #include "rtc_base/logging.h" +// Accesses ALSA functions through our late-binding symbol table instead of +// directly. This way we don't have to link to libasound, which means our binary +// will work on systems that don't have it. +#define LATE(sym) \ + LATESYM_GET(webrtc::adm_linux_alsa::AlsaSymbolTable, GetAlsaSymbolTable(), \ + sym) + namespace webrtc { AudioMixerManagerLinuxALSA::AudioMixerManagerLinuxALSA() diff --git a/modules/audio_device/linux/audio_mixer_manager_pulse_linux.cc b/modules/audio_device/linux/audio_mixer_manager_pulse_linux.cc index c50d56b799..1e49d62f51 100644 --- a/modules/audio_device/linux/audio_mixer_manager_pulse_linux.cc +++ b/modules/audio_device/linux/audio_mixer_manager_pulse_linux.cc @@ -10,18 +10,17 @@ #include +#include "modules/audio_device/linux/audio_device_pulse_linux.h" #include "modules/audio_device/linux/audio_mixer_manager_pulse_linux.h" #include "rtc_base/checks.h" #include "rtc_base/logging.h" -extern webrtc::adm_linux_pulse::PulseAudioSymbolTable PaSymbolTable; - // Accesses Pulse functions through our late-binding symbol table instead of -// directly. This way we don't have to link to libpulse, which means our -// binary will work on systems that don't have it. -#define LATE(sym) \ - LATESYM_GET(webrtc::adm_linux_pulse::PulseAudioSymbolTable, &PaSymbolTable, \ - sym) +// directly. This way we don't have to link to libpulse, which means our binary +// will work on systems that don't have it. +#define LATE(sym) \ + LATESYM_GET(webrtc::adm_linux_pulse::PulseAudioSymbolTable, \ + GetPulseSymbolTable(), sym) namespace webrtc {