From 27e727968a79d960a93e32151d786d58e9a642db Mon Sep 17 00:00:00 2001 From: zhongwuzw Date: Thu, 21 Mar 2019 23:34:14 -0700 Subject: [PATCH] Add copy for surface registry when return enumerator (#24056) Summary: To ensure all methods in surface registry thread safe, add copy to enumerator method. cc. shergin . [iOS] [Fixed] - Add copy for surface registry when return enumerator Pull Request resolved: https://github.com/facebook/react-native/pull/24056 Differential Revision: D14575446 Pulled By: shergin fbshipit-source-id: 6757f71e251381c4a38d13df4729e9494b3164d1 --- React/Fabric/Mounting/RCTMountingManager.h | 4 ++-- React/Fabric/RCTSurfacePresenter.mm | 16 ++++++++++------ React/Fabric/RCTSurfaceRegistry.h | 4 +++- React/Fabric/RCTSurfaceRegistry.mm | 5 ++--- 4 files changed, 17 insertions(+), 12 deletions(-) diff --git a/React/Fabric/Mounting/RCTMountingManager.h b/React/Fabric/Mounting/RCTMountingManager.h index 0f65e39812a..21e3a8c191d 100644 --- a/React/Fabric/Mounting/RCTMountingManager.h +++ b/React/Fabric/Mounting/RCTMountingManager.h @@ -26,8 +26,8 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, strong) RCTComponentViewRegistry *componentViewRegistry; /** - * Transfroms mutation insturctions to mount items and execute them. - * The order of mutation tnstructions matters. + * Transfroms mutation instructions to mount items and executes them. + * The order of mutation instructions matters. * Can be called from any thread. */ - (void)performTransactionWithMutations:(facebook::react::ShadowViewMutationList)mutations rootTag:(ReactTag)rootTag; diff --git a/React/Fabric/RCTSurfacePresenter.mm b/React/Fabric/RCTSurfacePresenter.mm index 711a1f29118..1a2ab70abf7 100644 --- a/React/Fabric/RCTSurfacePresenter.mm +++ b/React/Fabric/RCTSurfacePresenter.mm @@ -283,16 +283,20 @@ using namespace facebook::react; - (void)_startAllSurfaces { - for (RCTFabricSurface *surface in _surfaceRegistry.enumerator) { - [self _startSurface:surface]; - } + [_surfaceRegistry enumerateWithBlock:^(NSEnumerator *enumerator) { + for (RCTFabricSurface *surface in enumerator) { + [self _startSurface:surface]; + } + }]; } - (void)_stopAllSurfaces { - for (RCTFabricSurface *surface in _surfaceRegistry.enumerator) { - [self _stopSurface:surface]; - } + [_surfaceRegistry enumerateWithBlock:^(NSEnumerator *enumerator) { + for (RCTFabricSurface *surface in enumerator) { + [self _stopSurface:surface]; + } + }]; } #pragma mark - RCTSchedulerDelegate diff --git a/React/Fabric/RCTSurfaceRegistry.h b/React/Fabric/RCTSurfaceRegistry.h index d7a3e755cba..06be8d5d581 100644 --- a/React/Fabric/RCTSurfaceRegistry.h +++ b/React/Fabric/RCTSurfaceRegistry.h @@ -13,6 +13,8 @@ NS_ASSUME_NONNULL_BEGIN @class RCTFabricSurface; +typedef void(^RCTSurfaceEnumeratorBlock)(NSEnumerator *enumerator); + /** * Registry of Surfaces. * Incapsulates storing Surface objects and quering them by root tag. @@ -21,7 +23,7 @@ NS_ASSUME_NONNULL_BEGIN */ @interface RCTSurfaceRegistry : NSObject -- (NSEnumerator *)enumerator; +- (void)enumerateWithBlock:(RCTSurfaceEnumeratorBlock)block; /** * Adds Surface object into the registry. diff --git a/React/Fabric/RCTSurfaceRegistry.mm b/React/Fabric/RCTSurfaceRegistry.mm index 727b4d0e888..76bbf8f86fc 100644 --- a/React/Fabric/RCTSurfaceRegistry.mm +++ b/React/Fabric/RCTSurfaceRegistry.mm @@ -26,11 +26,10 @@ return self; } -- (NSEnumerator *)enumerator +- (void)enumerateWithBlock:(RCTSurfaceEnumeratorBlock)block { std::lock_guard lock(_mutex); - - return [_registry objectEnumerator]; + block([_registry objectEnumerator]); } - (void)registerSurface:(RCTFabricSurface *)surface