From 5a926c5c4e2f61e2718e882bc7cc11ef8e9c1d14 Mon Sep 17 00:00:00 2001 From: Xin Chen Date: Wed, 13 Sep 2023 10:22:34 -0700 Subject: [PATCH] Add thread idle indicator (#39206) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/39206 Add thread idle indicator to UI, JS and native modules threads to the RN perf monitor. Changelog: [Internal] - Add thread idle state to perf monitor Reviewed By: rshest Differential Revision: D48673070 fbshipit-source-id: e121eaf2a3149f0d0605681249808fc8dfaa5010 --- .../java/com/facebook/react/bridge/ReactContext.java | 12 ++++++++++++ .../react/bridge/queue/MessageQueueThread.java | 4 ++++ .../react/bridge/queue/MessageQueueThreadImpl.java | 6 ++++++ 3 files changed, 22 insertions(+) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactContext.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactContext.java index dfe32f2dd92..dfb1e641215 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactContext.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactContext.java @@ -441,6 +441,18 @@ public class ReactContext extends ContextWrapper { return Assertions.assertNotNull(mJSMessageQueueThread).runOnQueue(runnable); } + public @Nullable MessageQueueThread getJSMessageQueueThread() { + return mJSMessageQueueThread; + } + + public @Nullable MessageQueueThread getNativeModulesMessageQueueThread() { + return mNativeModulesMessageQueueThread; + } + + public @Nullable MessageQueueThread getUiMessageQueueThread() { + return mUiMessageQueueThread; + } + /** * Passes the given exception to the current {@link JSExceptionHandler} if one exists, rethrowing * otherwise. diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/queue/MessageQueueThread.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/queue/MessageQueueThread.java index 678af19b2ed..5b8b928c380 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/queue/MessageQueueThread.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/queue/MessageQueueThread.java @@ -69,4 +69,8 @@ public interface MessageQueueThread { */ @DoNotStrip void resetPerfStats(); + + /** Returns true if the message queue is idle */ + @DoNotStrip + boolean isIdle(); } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/queue/MessageQueueThreadImpl.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/queue/MessageQueueThreadImpl.java index ba03bbe3049..b5ed7d33843 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/queue/MessageQueueThreadImpl.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/queue/MessageQueueThreadImpl.java @@ -156,6 +156,12 @@ public class MessageQueueThreadImpl implements MessageQueueThread { }); } + @DoNotStrip + @Override + public boolean isIdle() { + return mLooper.getQueue().isIdle(); + } + private static void assignToPerfStats(MessageQueueThreadPerfStats stats, long wall, long cpu) { stats.wallTime = wall; stats.cpuTime = cpu;