From bf6852db2e46dc28eb6ae1a136ff6988e2bd7c9c Mon Sep 17 00:00:00 2001 From: Ruslan Lesiutin Date: Thu, 27 Feb 2025 08:32:12 -0800 Subject: [PATCH] Report JavaScript thread (#49395) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/49395 # Changelog: [Internal] Adding a new method to `RuntimeTarget` that will register it for Tracing. In our case, it will schedule a callback on JS executor that will register JavaScript thread with `PerformanceTracer`. Reviewed By: huntie Differential Revision: D69530984 fbshipit-source-id: 58cffe9e9c4482b494cfcfd3405f7bffa40cdc56 --- .../ReactCommon/jsinspector-modern/InstanceAgent.cpp | 1 + .../ReactCommon/jsinspector-modern/InstanceAgent.h | 3 +-- .../ReactCommon/jsinspector-modern/RuntimeAgent.cpp | 4 ++++ .../ReactCommon/jsinspector-modern/RuntimeAgent.h | 6 ++++++ .../ReactCommon/jsinspector-modern/RuntimeTarget.cpp | 11 +++++++++++ .../ReactCommon/jsinspector-modern/RuntimeTarget.h | 12 ++++++++++++ .../jsinspector-modern/tracing/PerformanceTracer.cpp | 4 ++++ .../jsinspector-modern/tracing/PerformanceTracer.h | 6 ++++++ 8 files changed, 45 insertions(+), 2 deletions(-) diff --git a/packages/react-native/ReactCommon/jsinspector-modern/InstanceAgent.cpp b/packages/react-native/ReactCommon/jsinspector-modern/InstanceAgent.cpp index 02c5ada57e0..a243c9821a2 100644 --- a/packages/react-native/ReactCommon/jsinspector-modern/InstanceAgent.cpp +++ b/packages/react-native/ReactCommon/jsinspector-modern/InstanceAgent.cpp @@ -154,6 +154,7 @@ void InstanceAgent::maybeSendPendingConsoleMessages() { void InstanceAgent::startTracing() { if (runtimeAgent_) { + runtimeAgent_->registerForTracing(); runtimeAgent_->enableSamplingProfiler(); } } diff --git a/packages/react-native/ReactCommon/jsinspector-modern/InstanceAgent.h b/packages/react-native/ReactCommon/jsinspector-modern/InstanceAgent.h index e75d37dfe1d..eeca9fd6e19 100644 --- a/packages/react-native/ReactCommon/jsinspector-modern/InstanceAgent.h +++ b/packages/react-native/ReactCommon/jsinspector-modern/InstanceAgent.h @@ -12,6 +12,7 @@ #include "SessionState.h" #include +#include #include #include @@ -19,8 +20,6 @@ namespace facebook::react::jsinspector_modern { -class InstanceTarget; - /** * An Agent that handles requests from the Chrome DevTools Protocol for the * given InstanceTarget. diff --git a/packages/react-native/ReactCommon/jsinspector-modern/RuntimeAgent.cpp b/packages/react-native/ReactCommon/jsinspector-modern/RuntimeAgent.cpp index f0d39061b73..c683a503807 100644 --- a/packages/react-native/ReactCommon/jsinspector-modern/RuntimeAgent.cpp +++ b/packages/react-native/ReactCommon/jsinspector-modern/RuntimeAgent.cpp @@ -149,6 +149,10 @@ RuntimeAgent::~RuntimeAgent() { sessionState_.lastRuntimeAgentExportedState = getExportedState(); } +void RuntimeAgent::registerForTracing() { + targetController_.registerForTracing(); +} + void RuntimeAgent::enableSamplingProfiler() { targetController_.enableSamplingProfiler(); } diff --git a/packages/react-native/ReactCommon/jsinspector-modern/RuntimeAgent.h b/packages/react-native/ReactCommon/jsinspector-modern/RuntimeAgent.h index 5945ef84691..5e973beadbb 100644 --- a/packages/react-native/ReactCommon/jsinspector-modern/RuntimeAgent.h +++ b/packages/react-native/ReactCommon/jsinspector-modern/RuntimeAgent.h @@ -83,6 +83,12 @@ class RuntimeAgent final { */ ExportedState getExportedState(); + /** + * Registers the corresponding RuntimeTarget for Tracing: might enable some + * capabilities that will be later used in Tracing Profile. + */ + void registerForTracing(); + /** * Start sampling profiler for the corresponding RuntimeTarget. */ diff --git a/packages/react-native/ReactCommon/jsinspector-modern/RuntimeTarget.cpp b/packages/react-native/ReactCommon/jsinspector-modern/RuntimeTarget.cpp index 8da9467cd6d..f00c175fad1 100644 --- a/packages/react-native/ReactCommon/jsinspector-modern/RuntimeTarget.cpp +++ b/packages/react-native/ReactCommon/jsinspector-modern/RuntimeTarget.cpp @@ -8,6 +8,7 @@ #include "SessionState.h" #include +#include using namespace facebook::jsi; @@ -159,6 +160,10 @@ void RuntimeTargetController::notifyDebuggerSessionDestroyed() { target_.emitDebuggerSessionDestroyed(); } +void RuntimeTargetController::registerForTracing() { + target_.registerForTracing(); +} + void RuntimeTargetController::enableSamplingProfiler() { target_.enableSamplingProfiler(); } @@ -172,6 +177,12 @@ RuntimeTargetController::collectSamplingProfile() { return target_.collectSamplingProfile(); } +void RuntimeTarget::registerForTracing() { + jsExecutor_([](auto& /*runtime*/) { + PerformanceTracer::getInstance().reportJavaScriptThread(); + }); +} + void RuntimeTarget::enableSamplingProfiler() { delegate_.enableSamplingProfiler(); } diff --git a/packages/react-native/ReactCommon/jsinspector-modern/RuntimeTarget.h b/packages/react-native/ReactCommon/jsinspector-modern/RuntimeTarget.h index c7ded154828..1ef4c75ac05 100644 --- a/packages/react-native/ReactCommon/jsinspector-modern/RuntimeTarget.h +++ b/packages/react-native/ReactCommon/jsinspector-modern/RuntimeTarget.h @@ -134,6 +134,12 @@ class RuntimeTargetController { */ void notifyDebuggerSessionDestroyed(); + /** + * Registers the corresponding RuntimeTarget for Tracing: might enable some + * capabilities that will be later used in Tracing Profile. + */ + void registerForTracing(); + /** * Start sampling profiler for the corresponding RuntimeTarget. */ @@ -202,6 +208,12 @@ class JSINSPECTOR_EXPORT RuntimeTarget FrontendChannel channel, SessionState& sessionState); + /** + * Registers this Runtime for Tracing: might enable some + * capabilities that will be later used in Tracing Profile. + */ + void registerForTracing(); + /** * Start sampling profiler for a particular JavaScript runtime. */ diff --git a/packages/react-native/ReactCommon/jsinspector-modern/tracing/PerformanceTracer.cpp b/packages/react-native/ReactCommon/jsinspector-modern/tracing/PerformanceTracer.cpp index 5aa79f070c5..730b5479031 100644 --- a/packages/react-native/ReactCommon/jsinspector-modern/tracing/PerformanceTracer.cpp +++ b/packages/react-native/ReactCommon/jsinspector-modern/tracing/PerformanceTracer.cpp @@ -188,6 +188,10 @@ void PerformanceTracer::reportProcess(uint64_t id, const std::string& name) { }); } +void PerformanceTracer::reportJavaScriptThread() { + reportThread(oscompat::getCurrentThreadId(), "JavaScript"); +} + void PerformanceTracer::reportThread(uint64_t id, const std::string& name) { if (!tracing_) { return; diff --git a/packages/react-native/ReactCommon/jsinspector-modern/tracing/PerformanceTracer.h b/packages/react-native/ReactCommon/jsinspector-modern/tracing/PerformanceTracer.h index afb693d2a47..57e19ffa658 100644 --- a/packages/react-native/ReactCommon/jsinspector-modern/tracing/PerformanceTracer.h +++ b/packages/react-native/ReactCommon/jsinspector-modern/tracing/PerformanceTracer.h @@ -88,6 +88,12 @@ class PerformanceTracer { */ void reportThread(uint64_t id, const std::string& name); + /** + * Should only be called from the JavaScript thread, will buffer metadata + * Trace Event. + */ + void reportJavaScriptThread(); + private: PerformanceTracer(); PerformanceTracer(const PerformanceTracer&) = delete;