diff --git a/packages/react-native/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler.cpp b/packages/react-native/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler.cpp index 9228f08edc8..21b1af649c6 100644 --- a/packages/react-native/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler.cpp +++ b/packages/react-native/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler.cpp @@ -19,23 +19,35 @@ namespace facebook::react { namespace { std::unique_ptr getRuntimeSchedulerImplementation( RuntimeExecutor runtimeExecutor, - std::function now) { + std::function now, + RuntimeSchedulerErrorHandler onTaskError, + RuntimeSchedulerErrorHandler onMicrotaskError) { if (ReactNativeFeatureFlags::useModernRuntimeScheduler()) { return std::make_unique( - std::move(runtimeExecutor), std::move(now)); + std::move(runtimeExecutor), + std::move(now), + std::move(onTaskError), + std::move(onMicrotaskError)); } else { return std::make_unique( - std::move(runtimeExecutor), std::move(now)); + std::move(runtimeExecutor), + std::move(now), + std::move(onTaskError), + std::move(onMicrotaskError)); } } } // namespace RuntimeScheduler::RuntimeScheduler( RuntimeExecutor runtimeExecutor, - std::function now) + std::function now, + RuntimeSchedulerErrorHandler onTaskError, + RuntimeSchedulerErrorHandler onMicrotaskError) : runtimeSchedulerImpl_(getRuntimeSchedulerImplementation( std::move(runtimeExecutor), - std::move(now))) {} + std::move(now), + std::move(onTaskError), + std::move(onMicrotaskError))) {} 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..4aea90cc086 100644 --- a/packages/react-native/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler.h +++ b/packages/react-native/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler.h @@ -8,6 +8,7 @@ #pragma once #include +#include #include #include #include @@ -19,6 +20,9 @@ namespace facebook::react { using RuntimeSchedulerRenderingUpdate = std::function; using RuntimeSchedulerTimeout = std::chrono::milliseconds; +using RuntimeSchedulerErrorHandler = + std::function; + // This is a temporary abstract class for RuntimeScheduler forks to implement // (and use them interchangeably). class RuntimeSchedulerBase { @@ -60,7 +64,15 @@ class RuntimeScheduler final : RuntimeSchedulerBase { explicit RuntimeScheduler( RuntimeExecutor runtimeExecutor, std::function now = - RuntimeSchedulerClock::now); + RuntimeSchedulerClock::now, + RuntimeSchedulerErrorHandler onTaskError = + [](jsi::Runtime& runtime, jsi::JSError& error) { + handleJSError(runtime, error, true); + }, + RuntimeSchedulerErrorHandler onMicrotaskError = + [](jsi::Runtime& runtime, jsi::JSError& error) { + handleJSError(runtime, error, true); + }); /* * Not copyable. 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..2c7e63838e9 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,13 @@ namespace facebook::react { RuntimeScheduler_Legacy::RuntimeScheduler_Legacy( RuntimeExecutor runtimeExecutor, - std::function now) - : runtimeExecutor_(std::move(runtimeExecutor)), now_(std::move(now)) {} + std::function now, + RuntimeSchedulerErrorHandler onTaskError, + RuntimeSchedulerErrorHandler onMicrotaskError) + : runtimeExecutor_(std::move(runtimeExecutor)), + now_(std::move(now)), + onTaskError_(std::move(onTaskError)), + onMicrotaskError_(std::move(onMicrotaskError)) {} void RuntimeScheduler_Legacy::scheduleWork(RawCallback&& callback) noexcept { SystraceSection s("RuntimeScheduler::scheduleWork"); @@ -167,7 +171,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 +228,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..8a9ab2a65ca 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,9 @@ class RuntimeScheduler_Legacy final : public RuntimeSchedulerBase { public: explicit RuntimeScheduler_Legacy( RuntimeExecutor runtimeExecutor, - std::function now); + std::function now, + RuntimeSchedulerErrorHandler onTaskError, + RuntimeSchedulerErrorHandler onMicrotaskError); /* * Not copyable. @@ -179,6 +181,9 @@ class RuntimeScheduler_Legacy final : public RuntimeSchedulerBase { ShadowTreeRevisionConsistencyManager* shadowTreeRevisionConsistencyManager_{ nullptr}; + + RuntimeSchedulerErrorHandler onTaskError_; + RuntimeSchedulerErrorHandler onMicrotaskError_; }; } // 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..2d2bca081a3 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,13 @@ std::chrono::milliseconds getResolvedTimeoutForIdleTask( RuntimeScheduler_Modern::RuntimeScheduler_Modern( RuntimeExecutor runtimeExecutor, - std::function now) - : runtimeExecutor_(std::move(runtimeExecutor)), now_(std::move(now)) {} + std::function now, + RuntimeSchedulerErrorHandler onTaskError, + RuntimeSchedulerErrorHandler onMicrotaskError) + : runtimeExecutor_(std::move(runtimeExecutor)), + now_(std::move(now)), + onTaskError_(std::move(onTaskError)), + onMicrotaskError_(std::move(onMicrotaskError)) {} void RuntimeScheduler_Modern::scheduleWork(RawCallback&& callback) noexcept { SystraceSection s("RuntimeScheduler::scheduleWork"); @@ -384,7 +388,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 +422,7 @@ void RuntimeScheduler_Modern::performMicrotaskCheckpoint( break; } } catch (jsi::JSError& error) { - handleJSError(runtime, error, true); + onMicrotaskError_(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..dc144b215b4 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,9 @@ class RuntimeScheduler_Modern final : public RuntimeSchedulerBase { public: explicit RuntimeScheduler_Modern( RuntimeExecutor runtimeExecutor, - std::function now); + std::function now, + RuntimeSchedulerErrorHandler onTaskError, + RuntimeSchedulerErrorHandler onMicrotaskError); /* * Not copyable. @@ -222,6 +224,9 @@ class RuntimeScheduler_Modern final : public RuntimeSchedulerBase { nullptr}; PerformanceEntryReporter* performanceEntryReporter_{nullptr}; + + RuntimeSchedulerErrorHandler onTaskError_; + RuntimeSchedulerErrorHandler onMicrotaskError_; }; } // namespace facebook::react