From 8cfd80f52c491d4bed5aa4bc637cd7090bc5d014 Mon Sep 17 00:00:00 2001 From: Vincent Viego Date: Tue, 15 Aug 2023 18:31:31 -0700 Subject: [PATCH] Default to AsynchronousBatched priority (#39011) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/39011 Changelog: [internal] Reviewed By: sammy-SC Differential Revision: D48210134 fbshipit-source-id: aac2aec11c35dd6a47bc8fd4bf74f2fa00ab3d7e --- .../facebook/react/config/ReactFeatureFlags.java | 3 +++ .../src/main/jni/react/fabric/Binding.cpp | 2 ++ .../components/view/BaseViewEventEmitter.cpp | 5 ++++- .../ReactCommon/react/renderer/core/ConcreteState.h | 13 ++++++++++--- .../ReactCommon/react/utils/CoreFeatures.cpp | 1 + .../ReactCommon/react/utils/CoreFeatures.h | 3 +++ 6 files changed, 23 insertions(+), 4 deletions(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java index b084ccbb43d..62109851897 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java @@ -160,4 +160,7 @@ public class ReactFeatureFlags { /** Clean yoga node when does not change. */ public static boolean enableCleanParagraphYogaNode = false; + + /** Default state updates and events to async batched priority. */ + public static boolean enableDefaultAsyncBatchedPriority = false; } diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/fabric/Binding.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/fabric/Binding.cpp index ea4cf210f4b..71bb6852c0a 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/fabric/Binding.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/fabric/Binding.cpp @@ -435,6 +435,8 @@ void Binding::installFabricUIManager( getFeatureFlagValue("doNotSwapLeftAndRightOnAndroidInLTR"); CoreFeatures::enableCleanParagraphYogaNode = getFeatureFlagValue("enableCleanParagraphYogaNode"); + CoreFeatures::enableDefaultAsyncBatchedPriority = + getFeatureFlagValue("enableDefaultAsyncBatchedPriority"); // RemoveDelete mega-op ShadowViewMutation::PlatformSupportsRemoveDeleteTreeInstruction = diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/BaseViewEventEmitter.cpp b/packages/react-native/ReactCommon/react/renderer/components/view/BaseViewEventEmitter.cpp index e5582ec2c69..4f57f76066f 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/BaseViewEventEmitter.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/view/BaseViewEventEmitter.cpp @@ -6,6 +6,7 @@ */ #include "BaseViewEventEmitter.h" +#include namespace facebook::react { @@ -112,7 +113,9 @@ void BaseViewEventEmitter::onLayout(const LayoutMetrics &layoutMetrics) const { payload.setProperty(runtime, "layout", std::move(layout)); return jsi::Value(std::move(payload)); }, - EventPriority::AsynchronousUnbatched); + CoreFeatures::enableDefaultAsyncBatchedPriority + ? EventPriority::AsynchronousBatched + : EventPriority::AsynchronousUnbatched); } } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/core/ConcreteState.h b/packages/react-native/ReactCommon/react/renderer/core/ConcreteState.h index 61fb3299cf7..a9f2ce17443 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/ConcreteState.h +++ b/packages/react-native/ReactCommon/react/renderer/core/ConcreteState.h @@ -12,6 +12,7 @@ #include #include +#include namespace facebook::react { @@ -58,9 +59,7 @@ class ConcreteState : public State { * function for cases where a new value of data does not depend on an old * value. */ - void updateState( - Data &&newData, - EventPriority priority = EventPriority::AsynchronousUnbatched) const { + void updateState(Data &&newData, EventPriority priority) const { updateState( [data{std::move(newData)}](Data const &oldData) -> SharedData { return std::make_shared(data); @@ -68,6 +67,14 @@ class ConcreteState : public State { priority); } + void updateState(Data &&newData) const { + updateState( + std::move(newData), + CoreFeatures::enableDefaultAsyncBatchedPriority + ? EventPriority::AsynchronousBatched + : EventPriority::AsynchronousUnbatched); + } + /* * Initiate a state update process with a given function (that transforms an * old data value to a new one) and priority. The callback function can be diff --git a/packages/react-native/ReactCommon/react/utils/CoreFeatures.cpp b/packages/react-native/ReactCommon/react/utils/CoreFeatures.cpp index 70054a836ba..88def7c490d 100644 --- a/packages/react-native/ReactCommon/react/utils/CoreFeatures.cpp +++ b/packages/react-native/ReactCommon/react/utils/CoreFeatures.cpp @@ -21,5 +21,6 @@ bool CoreFeatures::doNotSwapLeftAndRightOnAndroidInLTR = false; bool CoreFeatures::enableCleanParagraphYogaNode = false; bool CoreFeatures::disableScrollEventThrottleRequirement = false; bool CoreFeatures::enableGranularShadowTreeStateReconciliation = false; +bool CoreFeatures::enableDefaultAsyncBatchedPriority = false; } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/utils/CoreFeatures.h b/packages/react-native/ReactCommon/react/utils/CoreFeatures.h index 3a3763976ec..8b3a53bc353 100644 --- a/packages/react-native/ReactCommon/react/utils/CoreFeatures.h +++ b/packages/react-native/ReactCommon/react/utils/CoreFeatures.h @@ -64,6 +64,9 @@ class CoreFeatures { // When enabled, the renderer would only fail commits when they propagate // state and the last commit that updated state changed before committing. static bool enableGranularShadowTreeStateReconciliation; + + // Default state updates and events to async batched priority. + static bool enableDefaultAsyncBatchedPriority; }; } // namespace facebook::react