Replace blocking invokes with PostTask in AndroidNetworkMonitor

Use PendingTaskSafetyFlag for safe Stop. Followup to
https://webrtc-review.googlesource.com/c/src/+/209181.

Also fix rtc::scoped_refptr to work with RTC_PT_GUARDED_BY.

Bug: webrtc:12339
Change-Id: Ic0e3ecb17049f1a0e6af887ba5f97a5b48a32d98
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/211351
Commit-Queue: Niels Moller <nisse@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Reviewed-by: Jonas Oreland <jonaso@webrtc.org>
Reviewed-by: Sami Kalliomäki <sakal@webrtc.org>
Reviewed-by: Taylor <deadbeef@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#33447}
This commit is contained in:
Niels Möller
2021-03-12 14:08:23 +01:00
committed by Commit Bot
parent 048e9c2f45
commit 662b306bae
5 changed files with 41 additions and 14 deletions

View File

@ -21,6 +21,7 @@
#include "rtc_base/ip_address.h"
#include "rtc_base/logging.h"
#include "rtc_base/strings/string_builder.h"
#include "rtc_base/task_utils/to_queued_task.h"
#include "sdk/android/generated_base_jni/NetworkChangeDetector_jni.h"
#include "sdk/android/generated_base_jni/NetworkMonitor_jni.h"
#include "sdk/android/native_api/jni/java_types.h"
@ -228,9 +229,12 @@ 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()) {}
network_thread_(rtc::Thread::Current()),
safety_flag_(PendingTaskSafetyFlag::Create()) {}
AndroidNetworkMonitor::~AndroidNetworkMonitor() = default;
AndroidNetworkMonitor::~AndroidNetworkMonitor() {
RTC_DCHECK(!started_);
}
void AndroidNetworkMonitor::Start() {
RTC_DCHECK_RUN_ON(network_thread_);
@ -246,6 +250,9 @@ void AndroidNetworkMonitor::Start() {
bind_using_ifname_ =
webrtc::field_trial::IsEnabled("WebRTC-BindUsingInterfaceName");
// Needed for restart after Stop().
safety_flag_->SetAlive();
JNIEnv* env = AttachCurrentThreadIfNeeded();
Java_NetworkMonitor_startMonitoring(
env, j_network_monitor_, j_application_context_, jlongFromPointer(this));
@ -259,6 +266,10 @@ void AndroidNetworkMonitor::Stop() {
started_ = false;
find_network_handle_without_ipv6_temporary_part_ = false;
// Cancel any pending tasks. We should not call SignalNetworksChanged when the
// monitor is stopped.
safety_flag_->SetNotAlive();
JNIEnv* env = AttachCurrentThreadIfNeeded();
Java_NetworkMonitor_stopMonitoring(env, j_network_monitor_,
jlongFromPointer(this));
@ -571,11 +582,11 @@ AndroidNetworkMonitorFactory::CreateNetworkMonitor() {
void AndroidNetworkMonitor::NotifyConnectionTypeChanged(
JNIEnv* env,
const JavaRef<jobject>& j_caller) {
network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
network_thread_->PostTask(ToQueuedTask(safety_flag_, [this] {
RTC_LOG(LS_INFO)
<< "Android network monitor detected connection type change.";
SignalNetworksChanged();
});
}));
}
void AndroidNetworkMonitor::NotifyOfActiveNetworkList(
@ -594,18 +605,19 @@ void AndroidNetworkMonitor::NotifyOfNetworkConnect(
const JavaRef<jobject>& j_network_info) {
NetworkInformation network_info =
GetNetworkInformationFromJava(env, j_network_info);
network_thread_->Invoke<void>(RTC_FROM_HERE, [this, &network_info] {
OnNetworkConnected_n(network_info);
});
network_thread_->PostTask(ToQueuedTask(
safety_flag_, [this, network_info = std::move(network_info)] {
OnNetworkConnected_n(network_info);
}));
}
void AndroidNetworkMonitor::NotifyOfNetworkDisconnect(
JNIEnv* env,
const JavaRef<jobject>& j_caller,
jlong network_handle) {
network_thread_->Invoke<void>(RTC_FROM_HERE, [this, network_handle] {
network_thread_->PostTask(ToQueuedTask(safety_flag_, [this, network_handle] {
OnNetworkDisconnected_n(static_cast<NetworkHandle>(network_handle));
});
}));
}
void AndroidNetworkMonitor::NotifyOfNetworkPreference(
@ -617,9 +629,9 @@ void AndroidNetworkMonitor::NotifyOfNetworkPreference(
rtc::NetworkPreference preference =
static_cast<rtc::NetworkPreference>(jpreference);
network_thread_->Invoke<void>(RTC_FROM_HERE, [this, type, preference] {
OnNetworkPreference_n(type, preference);
});
network_thread_->PostTask(ToQueuedTask(
safety_flag_,
[this, type, preference] { OnNetworkPreference_n(type, preference); }));
}
} // namespace jni

View File

@ -12,6 +12,7 @@
#define SDK_ANDROID_SRC_JNI_ANDROID_NETWORK_MONITOR_H_
#include <stdint.h>
#include <map>
#include <string>
#include <vector>
@ -19,6 +20,7 @@
#include "absl/types/optional.h"
#include "rtc_base/network_monitor.h"
#include "rtc_base/network_monitor_factory.h"
#include "rtc_base/task_utils/pending_task_safety_flag.h"
#include "rtc_base/thread.h"
#include "rtc_base/thread_annotations.h"
#include "sdk/android/src/jni/jni_helpers.h"
@ -147,6 +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<PendingTaskSafetyFlag> safety_flag_
RTC_PT_GUARDED_BY(network_thread_);
};
class AndroidNetworkMonitorFactory : public rtc::NetworkMonitorFactory {