From 8fe2da53919d3163697945721c686cb8e10081fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Norte?= Date: Tue, 19 Sep 2023 09:03:33 -0700 Subject: [PATCH] Add Systrace instrumentation to RuntimeScheduler (#37880) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/37880 This adds systrace sections for the most relevant parts of `RuntimeScheduler`. This helps us identify how things are scheduled, which in this case makes it obvious we're not dispatching events the most efficient way (as top-level callbacks in the runtime executor instead of as tasks in the scheduler). Changelog: [internal] Reviewed By: rshest Differential Revision: D46556399 fbshipit-source-id: 93a13a2c5ec18a34712546889de21792671d5d2c --- .../renderer/runtimescheduler/CMakeLists.txt | 1 + .../React-runtimescheduler.podspec | 1 + .../runtimescheduler/RuntimeScheduler.cpp | 20 +++++++++++++++++++ 3 files changed, 22 insertions(+) diff --git a/packages/react-native/ReactCommon/react/renderer/runtimescheduler/CMakeLists.txt b/packages/react-native/ReactCommon/react/renderer/runtimescheduler/CMakeLists.txt index 1a25e838653..dbe7aeee7f8 100644 --- a/packages/react-native/ReactCommon/react/renderer/runtimescheduler/CMakeLists.txt +++ b/packages/react-native/ReactCommon/react/renderer/runtimescheduler/CMakeLists.txt @@ -25,4 +25,5 @@ target_link_libraries(react_render_runtimescheduler jsi react_debug react_render_core + react_render_debug runtimeexecutor) diff --git a/packages/react-native/ReactCommon/react/renderer/runtimescheduler/React-runtimescheduler.podspec b/packages/react-native/ReactCommon/react/renderer/runtimescheduler/React-runtimescheduler.podspec index 50ea692ca70..e4a197ab045 100644 --- a/packages/react-native/ReactCommon/react/renderer/runtimescheduler/React-runtimescheduler.podspec +++ b/packages/react-native/ReactCommon/react/renderer/runtimescheduler/React-runtimescheduler.podspec @@ -55,6 +55,7 @@ Pod::Spec.new do |s| s.dependency "React-runtimeexecutor" s.dependency "React-callinvoker" s.dependency "React-debug" + s.dependency "React-rendererdebug" s.dependency "React-utils" s.dependency "glog" s.dependency "RCT-Folly", folly_version diff --git a/packages/react-native/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler.cpp b/packages/react-native/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler.cpp index 79ac8ef245c..bd611aee1a0 100644 --- a/packages/react-native/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler.cpp +++ b/packages/react-native/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler.cpp @@ -8,6 +8,7 @@ #include "RuntimeScheduler.h" #include "SchedulerPriorityUtils.h" +#include #include #include "ErrorUtils.h" @@ -21,10 +22,13 @@ RuntimeScheduler::RuntimeScheduler( : runtimeExecutor_(std::move(runtimeExecutor)), now_(std::move(now)) {} void RuntimeScheduler::scheduleWork(RawCallback callback) const { + SystraceSection s("RuntimeScheduler::scheduleWork"); + runtimeAccessRequests_ += 1; runtimeExecutor_( [this, callback = std::move(callback)](jsi::Runtime& runtime) { + SystraceSection s2("RuntimeScheduler::scheduleWork callback"); runtimeAccessRequests_ -= 1; callback(runtime); startWorkLoop(runtime); @@ -78,10 +82,15 @@ RuntimeSchedulerTimePoint RuntimeScheduler::now() const noexcept { } void RuntimeScheduler::executeNowOnTheSameThread(RawCallback callback) { + SystraceSection s("RuntimeScheduler::executeNowOnTheSameThread"); + runtimeAccessRequests_ += 1; executeSynchronouslyOnSameThread_CAN_DEADLOCK( runtimeExecutor_, [this, callback = std::move(callback)](jsi::Runtime& runtime) { + SystraceSection s2( + "RuntimeScheduler::executeNowOnTheSameThread callback"); + runtimeAccessRequests_ -= 1; isSynchronous_ = true; callback(runtime); @@ -95,6 +104,8 @@ void RuntimeScheduler::executeNowOnTheSameThread(RawCallback callback) { } void RuntimeScheduler::callExpiredTasks(jsi::Runtime& runtime) { + SystraceSection s("RuntimeScheduler::callExpiredTasks"); + auto previousPriority = currentPriority_; try { while (!taskQueue_.empty()) { @@ -128,6 +139,8 @@ void RuntimeScheduler::scheduleWorkLoopIfNecessary() const { } void RuntimeScheduler::startWorkLoop(jsi::Runtime& runtime) const { + SystraceSection s("RuntimeScheduler::startWorkLoop"); + auto previousPriority = currentPriority_; isPerformingWork_ = true; try { @@ -155,6 +168,13 @@ void RuntimeScheduler::executeTask( jsi::Runtime& runtime, std::shared_ptr task, bool didUserCallbackTimeout) const { + SystraceSection s( + "RuntimeScheduler::executeTask", + "priority", + serialize(task->priority), + "didUserCallbackTimeout", + didUserCallbackTimeout); + currentPriority_ = task->priority; auto result = task->execute(runtime, didUserCallbackTimeout);