diff --git a/React/Fabric/RCTSurfaceRegistry.mm b/React/Fabric/RCTSurfaceRegistry.mm index 76bbf8f86fc..0eae535f40b 100644 --- a/React/Fabric/RCTSurfaceRegistry.mm +++ b/React/Fabric/RCTSurfaceRegistry.mm @@ -8,11 +8,15 @@ #import "RCTSurfaceRegistry.h" #import +#import +#import #import +using namespace facebook; + @implementation RCTSurfaceRegistry { - std::mutex _mutex; + better::shared_mutex _mutex; NSMapTable *_registry; } @@ -28,13 +32,13 @@ - (void)enumerateWithBlock:(RCTSurfaceEnumeratorBlock)block { - std::lock_guard lock(_mutex); + std::shared_lock lock(_mutex); block([_registry objectEnumerator]); } - (void)registerSurface:(RCTFabricSurface *)surface { - std::lock_guard lock(_mutex); + std::unique_lock lock(_mutex); ReactTag rootTag = surface.rootViewTag.integerValue; [_registry setObject:surface forKey:(__bridge id)(void *)rootTag]; @@ -42,7 +46,7 @@ - (void)unregisterSurface:(RCTFabricSurface *)surface { - std::lock_guard lock(_mutex); + std::unique_lock lock(_mutex); ReactTag rootTag = surface.rootViewTag.integerValue; [_registry removeObjectForKey:(__bridge id)(void *)rootTag]; @@ -50,7 +54,7 @@ - (RCTFabricSurface *)surfaceForRootTag:(ReactTag)rootTag { - std::lock_guard lock(_mutex); + std::shared_lock lock(_mutex); return [_registry objectForKey:(__bridge id)(void *)rootTag]; }