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:
zhongwuzw 2019-03-26 09:52:27 -07:00 коммит произвёл Facebook Github Bot
Родитель 5e4a5892b9
Коммит 946f1a6c87
1 изменённых файлов: 6 добавлений и 3 удалений

Просмотреть файл

@ -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];