Fix race condition in RTCNetworkMonitor/objc_network_monitor.

Bug: webrtc:13146
Change-Id: I74d645df8847f1e003d1dc8b64e79c6ef9bce285
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/231138
Reviewed-by: Linus Nilsson <lnilsson@webrtc.org>
Reviewed-by: Niels Moller <nisse@webrtc.org>
Commit-Queue: Peter Hanspers <peterhanspers@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#34917}
This commit is contained in:
Peter Hanspers
2021-09-03 13:18:41 +02:00
committed by WebRTC LUCI CQ
parent c4152a3bb1
commit 0bf94aaa7c
3 changed files with 22 additions and 2 deletions

View File

@ -20,4 +20,7 @@
- (instancetype)initWithObserver:(webrtc::NetworkMonitorObserver *)observer
NS_DESIGNATED_INITIALIZER;
/** Stops the receiver from posting updates to `observer`. */
- (void)stop;
@end

View File

@ -88,7 +88,12 @@ rtc::AdapterType AdapterTypeFromInterfaceType(nw_interface_type_t interfaceType)
rtc::AdapterType adapterType = AdapterTypeFromInterfaceType(interfaceType);
map->insert(std::pair<std::string, rtc::AdapterType>(name, adapterType));
});
strongSelf->_observer->OnPathUpdate(std::move(*map));
@synchronized(strongSelf) {
webrtc::NetworkMonitorObserver *observer = strongSelf->_observer;
if (observer) {
observer->OnPathUpdate(std::move(*map));
}
}
delete map;
});
nw_path_monitor_set_queue(
@ -100,10 +105,20 @@ rtc::AdapterType AdapterTypeFromInterfaceType(nw_interface_type_t interfaceType)
return self;
}
- (void)dealloc {
- (void)cancel {
if (@available(iOS 12, *)) {
nw_path_monitor_cancel(_pathMonitor);
}
}
- (void)stop {
[self cancel];
@synchronized(self) {
_observer = nil;
}
}
- (void)dealloc {
[self cancel];
}
@end

View File

@ -27,6 +27,7 @@ ObjCNetworkMonitor::ObjCNetworkMonitor() {
}
ObjCNetworkMonitor::~ObjCNetworkMonitor() {
[network_monitor_ stop];
network_monitor_ = nil;
}
@ -50,6 +51,7 @@ void ObjCNetworkMonitor::Stop() {
return;
}
safety_flag_->SetNotAlive();
[network_monitor_ stop];
network_monitor_ = nil;
started_ = false;
}