diff --git a/React/Base/RCTBridge.h b/React/Base/RCTBridge.h index 7e8494ebdad..8eef1cece61 100644 --- a/React/Base/RCTBridge.h +++ b/React/Base/RCTBridge.h @@ -160,6 +160,10 @@ RCT_EXTERN void RCTEnableTurboModuleEagerInit(BOOL enabled); RCT_EXTERN BOOL RCTTurboModuleSharedMutexInitEnabled(void); RCT_EXTERN void RCTEnableTurboModuleSharedMutexInit(BOOL enabled); +// Turn off TurboModule delegate locking +RCT_EXTERN BOOL RCTTurboModuleManagerDelegateLockingDisabled(void); +RCT_EXTERN void RCTDisableTurboModuleManagerDelegateLocking(BOOL enabled); + typedef enum { kRCTGlobalScope, kRCTGlobalScopeUsingRetainJSCallback, diff --git a/React/Base/RCTBridge.m b/React/Base/RCTBridge.m index 10503261d72..85533c04dfe 100644 --- a/React/Base/RCTBridge.m +++ b/React/Base/RCTBridge.m @@ -149,6 +149,18 @@ void RCTSetTurboModuleCleanupMode(RCTTurboModuleCleanupMode mode) turboModuleCleanupMode = mode; } +// Turn off TurboModule delegate locking +static BOOL turboModuleManagerDelegateLockingDisabled = NO; +BOOL RCTTurboModuleManagerDelegateLockingDisabled(void) +{ + return turboModuleManagerDelegateLockingDisabled; +} + +void RCTDisableTurboModuleManagerDelegateLocking(BOOL disabled) +{ + turboModuleManagerDelegateLockingDisabled = disabled; +} + @interface RCTBridge () @end diff --git a/ReactCommon/react/nativemodule/core/platform/ios/RCTTurboModuleManager.mm b/ReactCommon/react/nativemodule/core/platform/ios/RCTTurboModuleManager.mm index 6b26168f465..c740faf1ba3 100644 --- a/ReactCommon/react/nativemodule/core/platform/ios/RCTTurboModuleManager.mm +++ b/ReactCommon/react/nativemodule/core/platform/ios/RCTTurboModuleManager.mm @@ -422,9 +422,12 @@ static Class getFallbackClassFromName(const char *name) */ if ([_delegate respondsToSelector:@selector(getModuleClassFromName:)]) { - std::lock_guard delegateGuard(_turboModuleManagerDelegateMutex); - - moduleClass = [_delegate getModuleClassFromName:moduleName]; + if (RCTTurboModuleManagerDelegateLockingDisabled()) { + moduleClass = [_delegate getModuleClassFromName:moduleName]; + } else { + std::lock_guard delegateGuard(_turboModuleManagerDelegateMutex); + moduleClass = [_delegate getModuleClassFromName:moduleName]; + } } if (!moduleClass) { @@ -506,9 +509,12 @@ static Class getFallbackClassFromName(const char *name) TurboModulePerfLogger::moduleCreateConstructStart(moduleName, moduleId); if ([_delegate respondsToSelector:@selector(getModuleInstanceFromClass:)]) { - std::lock_guard delegateGuard(_turboModuleManagerDelegateMutex); - - module = [_delegate getModuleInstanceFromClass:moduleClass]; + if (RCTTurboModuleManagerDelegateLockingDisabled()) { + module = [_delegate getModuleInstanceFromClass:moduleClass]; + } else { + std::lock_guard delegateGuard(_turboModuleManagerDelegateMutex); + module = [_delegate getModuleInstanceFromClass:moduleClass]; + } } else { module = [moduleClass new]; }