Place static objects into a container that gets leaked.
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 <mbonadei@webrtc.org>
Commit-Queue: Sami Kalliomäki <sakal@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#24704}
diff --git a/sdk/android/BUILD.gn b/sdk/android/BUILD.gn
index 080684a..def4b38 100644
--- a/sdk/android/BUILD.gn
+++ b/sdk/android/BUILD.gn
@@ -604,11 +604,6 @@
# 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 7296bcb..35bdd89 100644
--- a/sdk/android/src/jni/pc/peerconnectionfactory.cc
+++ b/sdk/android/src/jni/pc/peerconnectionfactory.cc
@@ -46,6 +46,7 @@
namespace jni {
namespace {
+
PeerConnectionFactoryInterface::Options
JavaToNativePeerConnectionFactoryOptions(JNIEnv* jni,
const JavaRef<jobject>& options) {
@@ -72,6 +73,21 @@
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<std::string> field_trials_init_string;
+ // Set in PeerConnectionFactory_InjectLoggable().
+ std::unique_ptr<JNILogSink> 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 @@
// instead of "video.cc", which doesn't bring in the video-specific
// dependencies.
-// Field trials initialization string
-static std::unique_ptr<std::string> field_trials_init_string;
-
// Set in PeerConnectionFactory_initializeAndroidGlobals().
static bool factory_static_initialized = false;
-// Set in PeerConnectionFactory_InjectLoggable().
-static std::unique_ptr<JNILogSink> jni_log_sink;
-
void PeerConnectionFactoryNetworkThreadReady() {
RTC_LOG(LS_INFO) << "Network thread JavaCallback";
JNIEnv* env = AttachCurrentThreadIfNeeded();
@@ -137,6 +147,9 @@
JNIEnv* jni,
const JavaParamRef<jclass>&,
const JavaParamRef<jstring>& j_trials_init_string) {
+ std::unique_ptr<std::string>& 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 @@
jlong j_p) {
delete reinterpret_cast<OwnedFactoryAndThreads*>(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 @@
const JavaParamRef<jclass>&,
const JavaParamRef<jobject>& j_logging,
jint nativeSeverity) {
+ std::unique_ptr<JNILogSink>& 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_DeleteLoggable(
JNIEnv* jni,
const JavaParamRef<jclass>&) {
+ std::unique_ptr<JNILogSink>& jni_log_sink = GetStaticObjects().jni_log_sink;
+
if (jni_log_sink) {
rtc::LogMessage::RemoveLogToStream(jni_log_sink.get());
jni_log_sink.reset();