From 32adaa49c1cac0a6ceca065d31bfb9df626e9329 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sami=20Kalliom=C3=A4ki?= Date: Wed, 12 Sep 2018 15:03:19 +0200 Subject: [PATCH] Place static objects into a container that gets leaked. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This fixes the warning from -Wexit-time-destructors. Bug: webrtc:9736 Change-Id: I0ac4c63bbe9a7bc6486606dd3b067a5460dac072 Reviewed-on: https://webrtc-review.googlesource.com/99821 Reviewed-by: Mirko Bonadei Commit-Queue: Sami Kalliomäki Cr-Commit-Position: refs/heads/master@{#24704} --- sdk/android/BUILD.gn | 5 --- .../src/jni/pc/peerconnectionfactory.cc | 31 ++++++++++++++----- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/sdk/android/BUILD.gn b/sdk/android/BUILD.gn index 080684aaad..def4b389da 100644 --- a/sdk/android/BUILD.gn +++ b/sdk/android/BUILD.gn @@ -604,11 +604,6 @@ if (is_android) { # considered public and are subject to change. visibility = [ "*" ] - configs += [ - "../..:no_exit_time_destructors", - "../..:no_global_constructors", - ] - sources = [ "src/jni/androidnetworkmonitor_jni.h", "src/jni/pc/androidnetworkmonitor.h", diff --git a/sdk/android/src/jni/pc/peerconnectionfactory.cc b/sdk/android/src/jni/pc/peerconnectionfactory.cc index 7296bcbfd6..35bdd895ac 100644 --- a/sdk/android/src/jni/pc/peerconnectionfactory.cc +++ b/sdk/android/src/jni/pc/peerconnectionfactory.cc @@ -46,6 +46,7 @@ namespace webrtc { namespace jni { namespace { + PeerConnectionFactoryInterface::Options JavaToNativePeerConnectionFactoryOptions(JNIEnv* jni, const JavaRef& options) { @@ -72,6 +73,21 @@ JavaToNativePeerConnectionFactoryOptions(JNIEnv* jni, enable_gcm_crypto_suites; return native_options; } + +// Place static objects into a container that gets leaked so we avoid +// non-trivial destructor. +struct StaticObjectContainer { + // Field trials initialization string + std::unique_ptr field_trials_init_string; + // Set in PeerConnectionFactory_InjectLoggable(). + std::unique_ptr jni_log_sink; +}; + +StaticObjectContainer& GetStaticObjects() { + static StaticObjectContainer* static_objects = new StaticObjectContainer(); + return *static_objects; +} + } // namespace // Note: Some of the video-specific PeerConnectionFactory methods are @@ -80,15 +96,9 @@ JavaToNativePeerConnectionFactoryOptions(JNIEnv* jni, // instead of "video.cc", which doesn't bring in the video-specific // dependencies. -// Field trials initialization string -static std::unique_ptr field_trials_init_string; - // Set in PeerConnectionFactory_initializeAndroidGlobals(). static bool factory_static_initialized = false; -// Set in PeerConnectionFactory_InjectLoggable(). -static std::unique_ptr jni_log_sink; - void PeerConnectionFactoryNetworkThreadReady() { RTC_LOG(LS_INFO) << "Network thread JavaCallback"; JNIEnv* env = AttachCurrentThreadIfNeeded(); @@ -137,6 +147,9 @@ static void JNI_PeerConnectionFactory_InitializeFieldTrials( JNIEnv* jni, const JavaParamRef&, const JavaParamRef& j_trials_init_string) { + std::unique_ptr& field_trials_init_string = + GetStaticObjects().field_trials_init_string; + if (j_trials_init_string.is_null()) { field_trials_init_string = nullptr; field_trial::InitFieldTrialsFromString(nullptr); @@ -296,7 +309,7 @@ static void JNI_PeerConnectionFactory_FreeFactory(JNIEnv*, jlong j_p) { delete reinterpret_cast(j_p); field_trial::InitFieldTrialsFromString(nullptr); - field_trials_init_string = nullptr; + GetStaticObjects().field_trials_init_string = nullptr; } static void JNI_PeerConnectionFactory_InvokeThreadsCallbacks( @@ -462,6 +475,8 @@ static void JNI_PeerConnectionFactory_InjectLoggable( const JavaParamRef&, const JavaParamRef& j_logging, jint nativeSeverity) { + std::unique_ptr& jni_log_sink = GetStaticObjects().jni_log_sink; + // If there is already a LogSink, remove it from LogMessage. if (jni_log_sink) { rtc::LogMessage::RemoveLogToStream(jni_log_sink.get()); @@ -475,6 +490,8 @@ static void JNI_PeerConnectionFactory_InjectLoggable( static void JNI_PeerConnectionFactory_DeleteLoggable( JNIEnv* jni, const JavaParamRef&) { + std::unique_ptr& jni_log_sink = GetStaticObjects().jni_log_sink; + if (jni_log_sink) { rtc::LogMessage::RemoveLogToStream(jni_log_sink.get()); jni_log_sink.reset();