diff --git a/packages/react-native/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler.cpp b/packages/react-native/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler.cpp index 9228f08edc8..0919abb3b5e 100644 --- a/packages/react-native/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler.cpp +++ b/packages/react-native/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler.cpp @@ -10,6 +10,7 @@ #include "RuntimeScheduler_Modern.h" #include "SchedulerPriorityUtils.h" +#include #include #include #include @@ -19,23 +20,33 @@ namespace facebook::react { namespace { std::unique_ptr getRuntimeSchedulerImplementation( RuntimeExecutor runtimeExecutor, - std::function now) { + std::function now, + RuntimeSchedulerTaskErrorHandler onTaskError) { if (ReactNativeFeatureFlags::useModernRuntimeScheduler()) { return std::make_unique( - std::move(runtimeExecutor), std::move(now)); + std::move(runtimeExecutor), std::move(now), std::move(onTaskError)); } else { return std::make_unique( - std::move(runtimeExecutor), std::move(now)); + std::move(runtimeExecutor), std::move(now), std::move(onTaskError)); } } + } // namespace RuntimeScheduler::RuntimeScheduler( RuntimeExecutor runtimeExecutor, - std::function now) + std::function now, + RuntimeSchedulerTaskErrorHandler onTaskError) : runtimeSchedulerImpl_(getRuntimeSchedulerImplementation( std::move(runtimeExecutor), - std::move(now))) {} + std::move(now), + std::move(onTaskError))) {} + +/* static */ void RuntimeScheduler::handleTaskErrorDefault( + jsi::Runtime& runtime, + jsi::JSError& error) { + handleJSError(runtime, error, true); +} void RuntimeScheduler::scheduleWork(RawCallback&& callback) noexcept { return runtimeSchedulerImpl_->scheduleWork(std::move(callback)); diff --git a/packages/react-native/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler.h b/packages/react-native/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler.h index 9cf832c259e..4ce99ba82f9 100644 --- a/packages/react-native/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler.h +++ b/packages/react-native/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler.h @@ -19,6 +19,9 @@ namespace facebook::react { using RuntimeSchedulerRenderingUpdate = std::function; using RuntimeSchedulerTimeout = std::chrono::milliseconds; +using RuntimeSchedulerTaskErrorHandler = + std::function; + // This is a temporary abstract class for RuntimeScheduler forks to implement // (and use them interchangeably). class RuntimeSchedulerBase { @@ -60,7 +63,8 @@ class RuntimeScheduler final : RuntimeSchedulerBase { explicit RuntimeScheduler( RuntimeExecutor runtimeExecutor, std::function now = - RuntimeSchedulerClock::now); + RuntimeSchedulerClock::now, + RuntimeSchedulerTaskErrorHandler onTaskError = handleTaskErrorDefault); /* * Not copyable. @@ -163,6 +167,10 @@ class RuntimeScheduler final : RuntimeSchedulerBase { // Actual implementation, stored as a unique pointer to simplify memory // management. std::unique_ptr runtimeSchedulerImpl_; + + static void handleTaskErrorDefault( + jsi::Runtime& runtime, + jsi::JSError& error); }; } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler_Legacy.cpp b/packages/react-native/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler_Legacy.cpp index b1b2afe8bff..74084badfca 100644 --- a/packages/react-native/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler_Legacy.cpp +++ b/packages/react-native/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler_Legacy.cpp @@ -8,7 +8,6 @@ #include "RuntimeScheduler_Legacy.h" #include "SchedulerPriorityUtils.h" -#include #include #include #include @@ -19,8 +18,11 @@ namespace facebook::react { RuntimeScheduler_Legacy::RuntimeScheduler_Legacy( RuntimeExecutor runtimeExecutor, - std::function now) - : runtimeExecutor_(std::move(runtimeExecutor)), now_(std::move(now)) {} + std::function now, + RuntimeSchedulerTaskErrorHandler onTaskError) + : runtimeExecutor_(std::move(runtimeExecutor)), + now_(std::move(now)), + onTaskError_(std::move(onTaskError)) {} void RuntimeScheduler_Legacy::scheduleWork(RawCallback&& callback) noexcept { SystraceSection s("RuntimeScheduler::scheduleWork"); @@ -167,7 +169,7 @@ void RuntimeScheduler_Legacy::callExpiredTasks(jsi::Runtime& runtime) { executeTask(runtime, topPriorityTask, didUserCallbackTimeout); } } catch (jsi::JSError& error) { - handleJSError(runtime, error, true); + onTaskError_(runtime, error); } currentPriority_ = previousPriority; @@ -224,7 +226,7 @@ void RuntimeScheduler_Legacy::startWorkLoop(jsi::Runtime& runtime) { executeTask(runtime, topPriorityTask, didUserCallbackTimeout); } } catch (jsi::JSError& error) { - handleJSError(runtime, error, true); + onTaskError_(runtime, error); } currentPriority_ = previousPriority; diff --git a/packages/react-native/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler_Legacy.h b/packages/react-native/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler_Legacy.h index 117b36c7ab8..017c7323c84 100644 --- a/packages/react-native/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler_Legacy.h +++ b/packages/react-native/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler_Legacy.h @@ -22,7 +22,8 @@ class RuntimeScheduler_Legacy final : public RuntimeSchedulerBase { public: explicit RuntimeScheduler_Legacy( RuntimeExecutor runtimeExecutor, - std::function now); + std::function now, + RuntimeSchedulerTaskErrorHandler onTaskError); /* * Not copyable. @@ -179,6 +180,8 @@ class RuntimeScheduler_Legacy final : public RuntimeSchedulerBase { ShadowTreeRevisionConsistencyManager* shadowTreeRevisionConsistencyManager_{ nullptr}; + + RuntimeSchedulerTaskErrorHandler onTaskError_; }; } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler_Modern.cpp b/packages/react-native/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler_Modern.cpp index 969160d0ce1..5821863f919 100644 --- a/packages/react-native/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler_Modern.cpp +++ b/packages/react-native/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler_Modern.cpp @@ -8,7 +8,6 @@ #include "RuntimeScheduler_Modern.h" #include "SchedulerPriorityUtils.h" -#include #include #include #include @@ -33,8 +32,11 @@ std::chrono::milliseconds getResolvedTimeoutForIdleTask( RuntimeScheduler_Modern::RuntimeScheduler_Modern( RuntimeExecutor runtimeExecutor, - std::function now) - : runtimeExecutor_(std::move(runtimeExecutor)), now_(std::move(now)) {} + std::function now, + RuntimeSchedulerTaskErrorHandler onTaskError) + : runtimeExecutor_(std::move(runtimeExecutor)), + now_(std::move(now)), + onTaskError_(std::move(onTaskError)) {} void RuntimeScheduler_Modern::scheduleWork(RawCallback&& callback) noexcept { SystraceSection s("RuntimeScheduler::scheduleWork"); @@ -384,7 +386,7 @@ void RuntimeScheduler_Modern::executeTask( task.callback = result.getObject(runtime).getFunction(runtime); } } catch (jsi::JSError& error) { - handleJSError(runtime, error, true); + onTaskError_(runtime, error); } } @@ -418,7 +420,7 @@ void RuntimeScheduler_Modern::performMicrotaskCheckpoint( break; } } catch (jsi::JSError& error) { - handleJSError(runtime, error, true); + onTaskError_(runtime, error); } retries++; } diff --git a/packages/react-native/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler_Modern.h b/packages/react-native/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler_Modern.h index f380a6974c5..2395de22fc6 100644 --- a/packages/react-native/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler_Modern.h +++ b/packages/react-native/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler_Modern.h @@ -23,7 +23,8 @@ class RuntimeScheduler_Modern final : public RuntimeSchedulerBase { public: explicit RuntimeScheduler_Modern( RuntimeExecutor runtimeExecutor, - std::function now); + std::function now, + RuntimeSchedulerTaskErrorHandler onTaskError); /* * Not copyable. @@ -222,6 +223,8 @@ class RuntimeScheduler_Modern final : public RuntimeSchedulerBase { nullptr}; PerformanceEntryReporter* performanceEntryReporter_{nullptr}; + + RuntimeSchedulerTaskErrorHandler onTaskError_; }; } // namespace facebook::react