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 *_batchedBridge;
|
||||
std::shared_ptr<const ReactNativeConfig> _reactNativeConfig;
|
||||
std::mutex _observerListMutex;
|
||||
better::shared_mutex _observerListMutex;
|
||||
NSMutableArray<id<RCTSurfacePresenterObserver>> *_observers;
|
||||
}
|
||||
|
||||
|
@ -319,13 +319,13 @@ using namespace facebook::react;
|
|||
|
||||
- (void)addObserver:(id<RCTSurfacePresenterObserver>)observer
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(_observerListMutex);
|
||||
std::unique_lock<better::shared_mutex> lock(_observerListMutex);
|
||||
[self->_observers addObject: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];
|
||||
}
|
||||
|
||||
|
@ -335,6 +335,7 @@ using namespace facebook::react;
|
|||
{
|
||||
RCTAssertMainQueue();
|
||||
|
||||
std::shared_lock<better::shared_mutex> lock(_observerListMutex);
|
||||
for (id<RCTSurfacePresenterObserver> observer in _observers) {
|
||||
if ([observer respondsToSelector:@selector(willMountComponentsWithRootTag:)]) {
|
||||
[observer willMountComponentsWithRootTag:rootTag];
|
||||
|
@ -355,6 +356,8 @@ using namespace facebook::react;
|
|||
surface.view.rootView = (RCTSurfaceRootView *)rootComponentView;
|
||||
}
|
||||
}
|
||||
|
||||
std::shared_lock<better::shared_mutex> lock(_observerListMutex);
|
||||
for (id<RCTSurfacePresenterObserver> observer in _observers) {
|
||||
if ([observer respondsToSelector:@selector(didMountComponentsWithRootTag:)]) {
|
||||
[observer didMountComponentsWithRootTag:rootTag];
|
||||
|
|
Загрузка…
Ссылка в новой задаче