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. # considered public and are subject to change.
visibility = [ "*" ] visibility = [ "*" ]
configs += [
"../..:no_exit_time_destructors",
"../..:no_global_constructors",
]
sources = [ sources = [
"src/jni/androidnetworkmonitor_jni.h", "src/jni/androidnetworkmonitor_jni.h",
"src/jni/pc/androidnetworkmonitor.h", "src/jni/pc/androidnetworkmonitor.h",

View File

@ -46,6 +46,7 @@ namespace webrtc {
namespace jni { namespace jni {
namespace { namespace {
PeerConnectionFactoryInterface::Options PeerConnectionFactoryInterface::Options
JavaToNativePeerConnectionFactoryOptions(JNIEnv* jni, JavaToNativePeerConnectionFactoryOptions(JNIEnv* jni,
const JavaRef<jobject>& options) { const JavaRef<jobject>& options) {
@ -72,6 +73,21 @@ JavaToNativePeerConnectionFactoryOptions(JNIEnv* jni,
enable_gcm_crypto_suites; enable_gcm_crypto_suites;
return native_options; 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 } // namespace
// Note: Some of the video-specific PeerConnectionFactory methods are // 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 // instead of "video.cc", which doesn't bring in the video-specific
// dependencies. // dependencies.
// Field trials initialization string
static std::unique_ptr<std::string> field_trials_init_string;
// Set in PeerConnectionFactory_initializeAndroidGlobals(). // Set in PeerConnectionFactory_initializeAndroidGlobals().
static bool factory_static_initialized = false; static bool factory_static_initialized = false;
// Set in PeerConnectionFactory_InjectLoggable().
static std::unique_ptr<JNILogSink> jni_log_sink;
void PeerConnectionFactoryNetworkThreadReady() { void PeerConnectionFactoryNetworkThreadReady() {
RTC_LOG(LS_INFO) << "Network thread JavaCallback"; RTC_LOG(LS_INFO) << "Network thread JavaCallback";
JNIEnv* env = AttachCurrentThreadIfNeeded(); JNIEnv* env = AttachCurrentThreadIfNeeded();
@ -137,6 +147,9 @@ static void JNI_PeerConnectionFactory_InitializeFieldTrials(
JNIEnv* jni, JNIEnv* jni,
const JavaParamRef<jclass>&, const JavaParamRef<jclass>&,
const JavaParamRef<jstring>& j_trials_init_string) { 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()) { if (j_trials_init_string.is_null()) {
field_trials_init_string = nullptr; field_trials_init_string = nullptr;
field_trial::InitFieldTrialsFromString(nullptr); field_trial::InitFieldTrialsFromString(nullptr);
@ -296,7 +309,7 @@ static void JNI_PeerConnectionFactory_FreeFactory(JNIEnv*,
jlong j_p) { jlong j_p) {
delete reinterpret_cast<OwnedFactoryAndThreads*>(j_p); delete reinterpret_cast<OwnedFactoryAndThreads*>(j_p);
field_trial::InitFieldTrialsFromString(nullptr); field_trial::InitFieldTrialsFromString(nullptr);
field_trials_init_string = nullptr; GetStaticObjects().field_trials_init_string = nullptr;
} }
static void JNI_PeerConnectionFactory_InvokeThreadsCallbacks( static void JNI_PeerConnectionFactory_InvokeThreadsCallbacks(
@ -462,6 +475,8 @@ static void JNI_PeerConnectionFactory_InjectLoggable(
const JavaParamRef<jclass>&, const JavaParamRef<jclass>&,
const JavaParamRef<jobject>& j_logging, const JavaParamRef<jobject>& j_logging,
jint nativeSeverity) { jint nativeSeverity) {
std::unique_ptr<JNILogSink>& jni_log_sink = GetStaticObjects().jni_log_sink;
// If there is already a LogSink, remove it from LogMessage. // If there is already a LogSink, remove it from LogMessage.
if (jni_log_sink) { if (jni_log_sink) {
rtc::LogMessage::RemoveLogToStream(jni_log_sink.get()); rtc::LogMessage::RemoveLogToStream(jni_log_sink.get());
@ -475,6 +490,8 @@ static void JNI_PeerConnectionFactory_InjectLoggable(
static void JNI_PeerConnectionFactory_DeleteLoggable( static void JNI_PeerConnectionFactory_DeleteLoggable(
JNIEnv* jni, JNIEnv* jni,
const JavaParamRef<jclass>&) { const JavaParamRef<jclass>&) {
std::unique_ptr<JNILogSink>& jni_log_sink = GetStaticObjects().jni_log_sink;
if (jni_log_sink) { if (jni_log_sink) {
rtc::LogMessage::RemoveLogToStream(jni_log_sink.get()); rtc::LogMessage::RemoveLogToStream(jni_log_sink.get());
jni_log_sink.reset(); jni_log_sink.reset();