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:

committed by
WebRTC LUCI CQ

parent
c4152a3bb1
commit
0bf94aaa7c
@ -20,4 +20,7 @@
|
|||||||
- (instancetype)initWithObserver:(webrtc::NetworkMonitorObserver *)observer
|
- (instancetype)initWithObserver:(webrtc::NetworkMonitorObserver *)observer
|
||||||
NS_DESIGNATED_INITIALIZER;
|
NS_DESIGNATED_INITIALIZER;
|
||||||
|
|
||||||
|
/** Stops the receiver from posting updates to `observer`. */
|
||||||
|
- (void)stop;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
@ -88,7 +88,12 @@ rtc::AdapterType AdapterTypeFromInterfaceType(nw_interface_type_t interfaceType)
|
|||||||
rtc::AdapterType adapterType = AdapterTypeFromInterfaceType(interfaceType);
|
rtc::AdapterType adapterType = AdapterTypeFromInterfaceType(interfaceType);
|
||||||
map->insert(std::pair<std::string, rtc::AdapterType>(name, adapterType));
|
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;
|
delete map;
|
||||||
});
|
});
|
||||||
nw_path_monitor_set_queue(
|
nw_path_monitor_set_queue(
|
||||||
@ -100,10 +105,20 @@ rtc::AdapterType AdapterTypeFromInterfaceType(nw_interface_type_t interfaceType)
|
|||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)dealloc {
|
- (void)cancel {
|
||||||
if (@available(iOS 12, *)) {
|
if (@available(iOS 12, *)) {
|
||||||
nw_path_monitor_cancel(_pathMonitor);
|
nw_path_monitor_cancel(_pathMonitor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
- (void)stop {
|
||||||
|
[self cancel];
|
||||||
|
@synchronized(self) {
|
||||||
|
_observer = nil;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)dealloc {
|
||||||
|
[self cancel];
|
||||||
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
@ -27,6 +27,7 @@ ObjCNetworkMonitor::ObjCNetworkMonitor() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ObjCNetworkMonitor::~ObjCNetworkMonitor() {
|
ObjCNetworkMonitor::~ObjCNetworkMonitor() {
|
||||||
|
[network_monitor_ stop];
|
||||||
network_monitor_ = nil;
|
network_monitor_ = nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -50,6 +51,7 @@ void ObjCNetworkMonitor::Stop() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
safety_flag_->SetNotAlive();
|
safety_flag_->SetNotAlive();
|
||||||
|
[network_monitor_ stop];
|
||||||
network_monitor_ = nil;
|
network_monitor_ = nil;
|
||||||
started_ = false;
|
started_ = false;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user