From 2f53573d4f6eb529dee23236cf67b438e0256665 Mon Sep 17 00:00:00 2001 From: Dmitry Zakharov Date: Mon, 18 Jun 2018 07:37:23 -0700 Subject: [PATCH] Fix Modules concurrent access Reviewed By: fkgozali Differential Revision: D8379392 fbshipit-source-id: 72495950ea5fcf37f5b1cc3413666879dfc81e5c --- React/Base/RCTBridge.m | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/React/Base/RCTBridge.m b/React/Base/RCTBridge.m index 4f85966d9..f62074723 100644 --- a/React/Base/RCTBridge.m +++ b/React/Base/RCTBridge.m @@ -34,9 +34,14 @@ NSString *const RCTBridgeDidDownloadScriptNotificationSourceKey = @"source"; NSString *const RCTBridgeDidDownloadScriptNotificationBridgeDescriptionKey = @"bridgeDescription"; static NSMutableArray *RCTModuleClasses; +static dispatch_queue_t RCTModuleClassesSyncQueue; NSArray *RCTGetModuleClasses(void) { - return RCTModuleClasses; + __block NSArray *result; + dispatch_sync(RCTModuleClassesSyncQueue, ^{ + result = [RCTModuleClasses copy]; + }); + return result; } void RCTFBQuickPerformanceLoggerConfigureHooks(__unused JSGlobalContextRef ctx) { } @@ -51,6 +56,7 @@ void RCTRegisterModule(Class moduleClass) static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ RCTModuleClasses = [NSMutableArray new]; + RCTModuleClassesSyncQueue = dispatch_queue_create("com.facebook.react.ModuleClassesSyncQueue", DISPATCH_QUEUE_CONCURRENT); }); RCTAssert([moduleClass conformsToProtocol:@protocol(RCTBridgeModule)], @@ -58,7 +64,9 @@ void RCTRegisterModule(Class moduleClass) moduleClass); // Register module - [RCTModuleClasses addObject:moduleClass]; + dispatch_barrier_async(RCTModuleClassesSyncQueue, ^{ + [RCTModuleClasses addObject:moduleClass]; + }); } /**