From 3e774f64b07e4735c39fceba13c06d82620cc3d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20M=C3=B6ller?= Date: Mon, 15 Mar 2021 16:40:24 +0100 Subject: [PATCH] Make AndroidNetworkMonitor::Start() create a new task safety flag Instead of using SetAlive on the old flag (which might allow old tasks in the queue to run). Bug: webrtc:12339 Change-Id: Ia1a3eb6932f62881f013fd62b0e008d97d8713cd Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/211863 Reviewed-by: Tommi Reviewed-by: Danil Chapovalov Commit-Queue: Niels Moller Cr-Commit-Position: refs/heads/master@{#33475} --- sdk/android/src/jni/android_network_monitor.cc | 9 +++++---- sdk/android/src/jni/android_network_monitor.h | 4 ++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/sdk/android/src/jni/android_network_monitor.cc b/sdk/android/src/jni/android_network_monitor.cc index 03675132d7..fa82816431 100644 --- a/sdk/android/src/jni/android_network_monitor.cc +++ b/sdk/android/src/jni/android_network_monitor.cc @@ -229,8 +229,7 @@ AndroidNetworkMonitor::AndroidNetworkMonitor( : android_sdk_int_(Java_NetworkMonitor_androidSdkInt(env)), j_application_context_(env, j_application_context), j_network_monitor_(env, Java_NetworkMonitor_getInstance(env)), - network_thread_(rtc::Thread::Current()), - safety_flag_(PendingTaskSafetyFlag::Create()) {} + network_thread_(rtc::Thread::Current()) {} AndroidNetworkMonitor::~AndroidNetworkMonitor() { RTC_DCHECK(!started_); @@ -250,8 +249,10 @@ void AndroidNetworkMonitor::Start() { bind_using_ifname_ = webrtc::field_trial::IsEnabled("WebRTC-BindUsingInterfaceName"); - // Needed for restart after Stop(). - safety_flag_->SetAlive(); + // This pointer is also accessed by the methods called from java threads. + // Assigning it here is safe, because the java monitor is in a stopped state, + // and will not make any callbacks. + safety_flag_ = PendingTaskSafetyFlag::Create(); JNIEnv* env = AttachCurrentThreadIfNeeded(); Java_NetworkMonitor_startMonitoring( diff --git a/sdk/android/src/jni/android_network_monitor.h b/sdk/android/src/jni/android_network_monitor.h index 6349a11cf6..423ae3a66c 100644 --- a/sdk/android/src/jni/android_network_monitor.h +++ b/sdk/android/src/jni/android_network_monitor.h @@ -149,8 +149,8 @@ class AndroidNetworkMonitor : public rtc::NetworkMonitorInterface { // This applies to adapter_type_by_name_, vpn_underlying_adapter_type_by_name_ // and FindNetworkHandleFromIfname. bool bind_using_ifname_ RTC_GUARDED_BY(network_thread_) = true; - const rtc::scoped_refptr safety_flag_ - RTC_PT_GUARDED_BY(network_thread_); + rtc::scoped_refptr safety_flag_ + RTC_PT_GUARDED_BY(network_thread_) = nullptr; }; class AndroidNetworkMonitorFactory : public rtc::NetworkMonitorFactory {