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}
This commit is contained in:
Sami Kalliomäki
2018-09-12 15:03:19 +02:00
committed by Commit Bot
parent 1a80018a3c
commit 32adaa49c1
2 changed files with 24 additions and 12 deletions

View File

@ -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",

View File

@ -46,6 +46,7 @@ namespace webrtc {
namespace jni {
namespace {
PeerConnectionFactoryInterface::Options
JavaToNativePeerConnectionFactoryOptions(JNIEnv* jni,
const JavaRef<jobject>& 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<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 @@ JavaToNativePeerConnectionFactoryOptions(JNIEnv* jni,
// 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 @@ static void JNI_PeerConnectionFactory_InitializeFieldTrials(
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 @@ static void JNI_PeerConnectionFactory_FreeFactory(JNIEnv*,
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 @@ static void JNI_PeerConnectionFactory_InjectLoggable(
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_InjectLoggable(
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();