Add lock for surface presenter observers (#24052)
Summary: Add lock for observers when do enumeration. cc. shergin . [iOS] [Fixed] - Add lock for surface presenter observers Pull Request resolved: https://github.com/facebook/react-native/pull/24052 Differential Revision: D14619029 Pulled By: shergin fbshipit-source-id: b843ac0e4b106a572de75663840f2e5e5f126f31
This commit is contained in:
Родитель
5e4a5892b9
Коммит
946f1a6c87
|
@ -53,7 +53,7 @@ using namespace facebook::react;
|
||||||
RCTBridge *_bridge; // Unsafe. We are moving away from Bridge.
|
RCTBridge *_bridge; // Unsafe. We are moving away from Bridge.
|
||||||
RCTBridge *_batchedBridge;
|
RCTBridge *_batchedBridge;
|
||||||
std::shared_ptr<const ReactNativeConfig> _reactNativeConfig;
|
std::shared_ptr<const ReactNativeConfig> _reactNativeConfig;
|
||||||
std::mutex _observerListMutex;
|
better::shared_mutex _observerListMutex;
|
||||||
NSMutableArray<id<RCTSurfacePresenterObserver>> *_observers;
|
NSMutableArray<id<RCTSurfacePresenterObserver>> *_observers;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -319,13 +319,13 @@ using namespace facebook::react;
|
||||||
|
|
||||||
- (void)addObserver:(id<RCTSurfacePresenterObserver>)observer
|
- (void)addObserver:(id<RCTSurfacePresenterObserver>)observer
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lock(_observerListMutex);
|
std::unique_lock<better::shared_mutex> lock(_observerListMutex);
|
||||||
[self->_observers addObject:observer];
|
[self->_observers addObject:observer];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)removeObserver:(id<RCTSurfacePresenterObserver>)observer
|
- (void)removeObserver:(id<RCTSurfacePresenterObserver>)observer
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lock(_observerListMutex);
|
std::unique_lock<better::shared_mutex> lock(_observerListMutex);
|
||||||
[self->_observers removeObject:observer];
|
[self->_observers removeObject:observer];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -335,6 +335,7 @@ using namespace facebook::react;
|
||||||
{
|
{
|
||||||
RCTAssertMainQueue();
|
RCTAssertMainQueue();
|
||||||
|
|
||||||
|
std::shared_lock<better::shared_mutex> lock(_observerListMutex);
|
||||||
for (id<RCTSurfacePresenterObserver> observer in _observers) {
|
for (id<RCTSurfacePresenterObserver> observer in _observers) {
|
||||||
if ([observer respondsToSelector:@selector(willMountComponentsWithRootTag:)]) {
|
if ([observer respondsToSelector:@selector(willMountComponentsWithRootTag:)]) {
|
||||||
[observer willMountComponentsWithRootTag:rootTag];
|
[observer willMountComponentsWithRootTag:rootTag];
|
||||||
|
@ -355,6 +356,8 @@ using namespace facebook::react;
|
||||||
surface.view.rootView = (RCTSurfaceRootView *)rootComponentView;
|
surface.view.rootView = (RCTSurfaceRootView *)rootComponentView;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::shared_lock<better::shared_mutex> lock(_observerListMutex);
|
||||||
for (id<RCTSurfacePresenterObserver> observer in _observers) {
|
for (id<RCTSurfacePresenterObserver> observer in _observers) {
|
||||||
if ([observer respondsToSelector:@selector(didMountComponentsWithRootTag:)]) {
|
if ([observer respondsToSelector:@selector(didMountComponentsWithRootTag:)]) {
|
||||||
[observer didMountComponentsWithRootTag:rootTag];
|
[observer didMountComponentsWithRootTag:rootTag];
|
||||||
|
|
Загрузка…
Ссылка в новой задаче