diff --git a/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.h b/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.h index 18c318408d8..a5bd94cb730 100644 --- a/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.h +++ b/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.h @@ -94,6 +94,11 @@ */ - (UIViewController *)createRootViewController; +/// This method controls whether the App will use RuntimeScheduler. Only applicable in the legacy architecture. +/// +/// @return: `YES` to use RuntimeScheduler, `NO` to use JavaScript scheduler. The default value is `YES`. +- (BOOL)runtimeSchedulerEnabled; + #if RCT_NEW_ARCH_ENABLED /// The TurboModule manager diff --git a/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.mm b/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.mm index ca6fff5fc41..7be91c312e9 100644 --- a/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.mm +++ b/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.mm @@ -134,11 +134,16 @@ static NSString *const kRNConcurrentRoot = @"concurrentRoot"; return [UIViewController new]; } +- (BOOL)runtimeSchedulerEnabled +{ + return YES; +} + #pragma mark - RCTCxxBridgeDelegate - (std::unique_ptr)jsExecutorFactoryForBridge:(RCTBridge *)bridge { - _runtimeScheduler = std::make_shared(RCTRuntimeExecutorFromBridge(bridge)); #if RCT_NEW_ARCH_ENABLED + _runtimeScheduler = std::make_shared(RCTRuntimeExecutorFromBridge(bridge)); std::shared_ptr callInvoker = std::make_shared(_runtimeScheduler); self.turboModuleManager = [[RCTTurboModuleManager alloc] initWithBridge:bridge delegate:self jsInvoker:callInvoker]; @@ -146,6 +151,9 @@ static NSString *const kRNConcurrentRoot = @"concurrentRoot"; _contextContainer->insert("RuntimeScheduler", _runtimeScheduler); return RCTAppSetupDefaultJsExecutorFactory(bridge, self.turboModuleManager, _runtimeScheduler); #else + if (self.runtimeSchedulerEnabled) { + _runtimeScheduler = std::make_shared(RCTRuntimeExecutorFromBridge(bridge)); + } return RCTAppSetupJsExecutorFactoryForOldArch(bridge, _runtimeScheduler); #endif } diff --git a/packages/react-native/ReactCommon/react/renderer/runtimescheduler/primitives.h b/packages/react-native/ReactCommon/react/renderer/runtimescheduler/primitives.h index b3db7b49b4b..716004dd370 100644 --- a/packages/react-native/ReactCommon/react/renderer/runtimescheduler/primitives.h +++ b/packages/react-native/ReactCommon/react/renderer/runtimescheduler/primitives.h @@ -19,11 +19,17 @@ struct TaskWrapper : public jsi::HostObject { std::shared_ptr task; }; +struct TaskWrapper : public jsi::HostObject { + TaskWrapper(std::shared_ptr const &task) : task(task) {} + + std::shared_ptr task; +}; + inline static jsi::Value valueFromTask( jsi::Runtime &runtime, std::shared_ptr task) { return jsi::Object::createFromHostObject( - runtime, std::make_shared(task)); + runtime, std::make_shared(task)); } inline static std::shared_ptr taskFromValue(