Skip to content

Commit 85f1d9a

Browse files
shwantonfacebook-github-bot
authored andcommitted
Back out "Unify feature flags for event loop" (#47041)
Summary: Pull Request resolved: #47041 Original commit changeset: b879447def8a Original Phabricator Diff: D64175216 Reviewed By: fkgozali Differential Revision: D64439014 fbshipit-source-id: efc1bb7baa547d270322aabf6c5a4f50ace23e1b
1 parent 557e344 commit 85f1d9a

31 files changed

Lines changed: 574 additions & 174 deletions

packages/react-native/Libraries/AppDelegate/RCTAppDelegate.mm

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,18 @@ - (RCTRootViewFactory *)createRCTRootViewFactory
307307

308308
class RCTAppDelegateBridgelessFeatureFlags : public facebook::react::ReactNativeFeatureFlagsDefaults {
309309
public:
310+
bool useModernRuntimeScheduler() override
311+
{
312+
return true;
313+
}
314+
bool enableMicrotasks() override
315+
{
316+
return true;
317+
}
318+
bool batchRenderingUpdatesInEventLoop() override
319+
{
320+
return true;
321+
}
310322
bool enableBridgelessArchitecture() override
311323
{
312324
return true;

packages/react-native/Libraries/Core/setUpTimers.js

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,12 @@ if (global.RN$Bridgeless !== true) {
4848
defineLazyTimer('cancelAnimationFrame');
4949
defineLazyTimer('requestIdleCallback');
5050
defineLazyTimer('cancelIdleCallback');
51-
} else if (!ReactNativeFeatureFlags.disableEventLoopOnBridgeless()) {
51+
} else if (
52+
// TODO remove this condition when bridgeless == modern scheduler everywhere.
53+
NativeReactNativeFeatureFlags != null &&
54+
// eslint-disable-next-line react-hooks/rules-of-hooks -- false positive due to `use` prefix
55+
ReactNativeFeatureFlags.useModernRuntimeScheduler()
56+
) {
5257
polyfillGlobal(
5358
'requestIdleCallback',
5459
() =>
@@ -64,9 +69,12 @@ if (global.RN$Bridgeless !== true) {
6469
);
6570
}
6671

72+
// We need to check if the native module is available before accessing the
73+
// feature flag, because otherwise the API would throw an error in the legacy
74+
// architecture in OSS, where the native module isn't available.
6775
if (
68-
global.RN$Bridgeless === true &&
69-
!ReactNativeFeatureFlags.disableEventLoopOnBridgeless()
76+
NativeReactNativeFeatureFlags != null &&
77+
ReactNativeFeatureFlags.enableMicrotasks()
7078
) {
7179
// This is the flag that tells React to use `queueMicrotask` to batch state
7280
// updates, instead of using the scheduler to schedule a regular task.

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<4826cc8f70f03ef058fccfc4a6f282ae>>
7+
* @generated SignedSource<<af80868112a7748983aaa6e638d0068e>>
88
*/
99

1010
/**
@@ -41,16 +41,16 @@ public object ReactNativeFeatureFlags {
4141
public fun allowRecursiveCommitsWithSynchronousMountOnAndroid(): Boolean = accessor.allowRecursiveCommitsWithSynchronousMountOnAndroid()
4242

4343
/**
44-
* Do not wait for a main-thread dispatch to complete init to start executing work on the JS thread on Android
44+
* When enabled, the RuntimeScheduler processing the event loop will batch all rendering updates and dispatch them together at the end of each iteration of the loop.
4545
*/
4646
@JvmStatic
47-
public fun completeReactInstanceCreationOnBgThreadOnAndroid(): Boolean = accessor.completeReactInstanceCreationOnBgThreadOnAndroid()
47+
public fun batchRenderingUpdatesInEventLoop(): Boolean = accessor.batchRenderingUpdatesInEventLoop()
4848

4949
/**
50-
* The bridgeless architecture enables the event loop by default. This feature flag allows us to force disabling it in specific instances.
50+
* Do not wait for a main-thread dispatch to complete init to start executing work on the JS thread on Android
5151
*/
5252
@JvmStatic
53-
public fun disableEventLoopOnBridgeless(): Boolean = accessor.disableEventLoopOnBridgeless()
53+
public fun completeReactInstanceCreationOnBgThreadOnAndroid(): Boolean = accessor.completeReactInstanceCreationOnBgThreadOnAndroid()
5454

5555
/**
5656
* Kill-switch to turn off support for aling-items:baseline on Fabric iOS.
@@ -142,6 +142,12 @@ public object ReactNativeFeatureFlags {
142142
@JvmStatic
143143
public fun enableLongTaskAPI(): Boolean = accessor.enableLongTaskAPI()
144144

145+
/**
146+
* Enables the use of microtasks in Hermes (scheduling) and RuntimeScheduler (execution).
147+
*/
148+
@JvmStatic
149+
public fun enableMicrotasks(): Boolean = accessor.enableMicrotasks()
150+
145151
/**
146152
* Moves execution of pre-mount items to outside the choregrapher in the main thread, so we can estimate idle time more precisely (Android only).
147153
*/
@@ -268,6 +274,12 @@ public object ReactNativeFeatureFlags {
268274
@JvmStatic
269275
public fun useImmediateExecutorInAndroidBridgeless(): Boolean = accessor.useImmediateExecutorInAndroidBridgeless()
270276

277+
/**
278+
* When enabled, it uses the modern fork of RuntimeScheduler that allows scheduling tasks with priorities from any thread.
279+
*/
280+
@JvmStatic
281+
public fun useModernRuntimeScheduler(): Boolean = accessor.useModernRuntimeScheduler()
282+
271283
/**
272284
* When enabled, the native view configs are used in bridgeless mode.
273285
*/

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<c1299f04cde6bff791f355e12ccf4df8>>
7+
* @generated SignedSource<<b0a0f792ea56ce65a44de3ce90ec72ee>>
88
*/
99

1010
/**
@@ -22,8 +22,8 @@ package com.facebook.react.internal.featureflags
2222
public class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAccessor {
2323
private var commonTestFlagCache: Boolean? = null
2424
private var allowRecursiveCommitsWithSynchronousMountOnAndroidCache: Boolean? = null
25+
private var batchRenderingUpdatesInEventLoopCache: Boolean? = null
2526
private var completeReactInstanceCreationOnBgThreadOnAndroidCache: Boolean? = null
26-
private var disableEventLoopOnBridgelessCache: Boolean? = null
2727
private var enableAlignItemsBaselineOnFabricIOSCache: Boolean? = null
2828
private var enableAndroidLineHeightCenteringCache: Boolean? = null
2929
private var enableBridgelessArchitectureCache: Boolean? = null
@@ -39,6 +39,7 @@ public class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAccesso
3939
private var enableLayoutAnimationsOnAndroidCache: Boolean? = null
4040
private var enableLayoutAnimationsOnIOSCache: Boolean? = null
4141
private var enableLongTaskAPICache: Boolean? = null
42+
private var enableMicrotasksCache: Boolean? = null
4243
private var enablePreciseSchedulingForPremountItemsOnAndroidCache: Boolean? = null
4344
private var enablePropsUpdateReconciliationAndroidCache: Boolean? = null
4445
private var enableReportEventPaintTimeCache: Boolean? = null
@@ -60,6 +61,7 @@ public class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAccesso
6061
private var traceTurboModulePromiseRejectionsOnAndroidCache: Boolean? = null
6162
private var useFabricInteropCache: Boolean? = null
6263
private var useImmediateExecutorInAndroidBridgelessCache: Boolean? = null
64+
private var useModernRuntimeSchedulerCache: Boolean? = null
6365
private var useNativeViewConfigsInBridgelessModeCache: Boolean? = null
6466
private var useOptimisedViewPreallocationOnAndroidCache: Boolean? = null
6567
private var useOptimizedEventBatchingOnAndroidCache: Boolean? = null
@@ -85,20 +87,20 @@ public class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAccesso
8587
return cached
8688
}
8789

88-
override fun completeReactInstanceCreationOnBgThreadOnAndroid(): Boolean {
89-
var cached = completeReactInstanceCreationOnBgThreadOnAndroidCache
90+
override fun batchRenderingUpdatesInEventLoop(): Boolean {
91+
var cached = batchRenderingUpdatesInEventLoopCache
9092
if (cached == null) {
91-
cached = ReactNativeFeatureFlagsCxxInterop.completeReactInstanceCreationOnBgThreadOnAndroid()
92-
completeReactInstanceCreationOnBgThreadOnAndroidCache = cached
93+
cached = ReactNativeFeatureFlagsCxxInterop.batchRenderingUpdatesInEventLoop()
94+
batchRenderingUpdatesInEventLoopCache = cached
9395
}
9496
return cached
9597
}
9698

97-
override fun disableEventLoopOnBridgeless(): Boolean {
98-
var cached = disableEventLoopOnBridgelessCache
99+
override fun completeReactInstanceCreationOnBgThreadOnAndroid(): Boolean {
100+
var cached = completeReactInstanceCreationOnBgThreadOnAndroidCache
99101
if (cached == null) {
100-
cached = ReactNativeFeatureFlagsCxxInterop.disableEventLoopOnBridgeless()
101-
disableEventLoopOnBridgelessCache = cached
102+
cached = ReactNativeFeatureFlagsCxxInterop.completeReactInstanceCreationOnBgThreadOnAndroid()
103+
completeReactInstanceCreationOnBgThreadOnAndroidCache = cached
102104
}
103105
return cached
104106
}
@@ -238,6 +240,15 @@ public class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAccesso
238240
return cached
239241
}
240242

243+
override fun enableMicrotasks(): Boolean {
244+
var cached = enableMicrotasksCache
245+
if (cached == null) {
246+
cached = ReactNativeFeatureFlagsCxxInterop.enableMicrotasks()
247+
enableMicrotasksCache = cached
248+
}
249+
return cached
250+
}
251+
241252
override fun enablePreciseSchedulingForPremountItemsOnAndroid(): Boolean {
242253
var cached = enablePreciseSchedulingForPremountItemsOnAndroidCache
243254
if (cached == null) {
@@ -427,6 +438,15 @@ public class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAccesso
427438
return cached
428439
}
429440

441+
override fun useModernRuntimeScheduler(): Boolean {
442+
var cached = useModernRuntimeSchedulerCache
443+
if (cached == null) {
444+
cached = ReactNativeFeatureFlagsCxxInterop.useModernRuntimeScheduler()
445+
useModernRuntimeSchedulerCache = cached
446+
}
447+
return cached
448+
}
449+
430450
override fun useNativeViewConfigsInBridgelessMode(): Boolean {
431451
var cached = useNativeViewConfigsInBridgelessModeCache
432452
if (cached == null) {

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<579950bccf5b11ca473a0de01615756e>>
7+
* @generated SignedSource<<2f1e29ca29c3679e5a87be1d0944efd9>>
88
*/
99

1010
/**
@@ -32,9 +32,9 @@ public object ReactNativeFeatureFlagsCxxInterop {
3232

3333
@DoNotStrip @JvmStatic public external fun allowRecursiveCommitsWithSynchronousMountOnAndroid(): Boolean
3434

35-
@DoNotStrip @JvmStatic public external fun completeReactInstanceCreationOnBgThreadOnAndroid(): Boolean
35+
@DoNotStrip @JvmStatic public external fun batchRenderingUpdatesInEventLoop(): Boolean
3636

37-
@DoNotStrip @JvmStatic public external fun disableEventLoopOnBridgeless(): Boolean
37+
@DoNotStrip @JvmStatic public external fun completeReactInstanceCreationOnBgThreadOnAndroid(): Boolean
3838

3939
@DoNotStrip @JvmStatic public external fun enableAlignItemsBaselineOnFabricIOS(): Boolean
4040

@@ -66,6 +66,8 @@ public object ReactNativeFeatureFlagsCxxInterop {
6666

6767
@DoNotStrip @JvmStatic public external fun enableLongTaskAPI(): Boolean
6868

69+
@DoNotStrip @JvmStatic public external fun enableMicrotasks(): Boolean
70+
6971
@DoNotStrip @JvmStatic public external fun enablePreciseSchedulingForPremountItemsOnAndroid(): Boolean
7072

7173
@DoNotStrip @JvmStatic public external fun enablePropsUpdateReconciliationAndroid(): Boolean
@@ -108,6 +110,8 @@ public object ReactNativeFeatureFlagsCxxInterop {
108110

109111
@DoNotStrip @JvmStatic public external fun useImmediateExecutorInAndroidBridgeless(): Boolean
110112

113+
@DoNotStrip @JvmStatic public external fun useModernRuntimeScheduler(): Boolean
114+
111115
@DoNotStrip @JvmStatic public external fun useNativeViewConfigsInBridgelessMode(): Boolean
112116

113117
@DoNotStrip @JvmStatic public external fun useOptimisedViewPreallocationOnAndroid(): Boolean

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<45065c5d8f78528edc1665fb405860b8>>
7+
* @generated SignedSource<<f99453feaef7994f46278d40af544771>>
88
*/
99

1010
/**
@@ -27,9 +27,9 @@ public open class ReactNativeFeatureFlagsDefaults : ReactNativeFeatureFlagsProvi
2727

2828
override fun allowRecursiveCommitsWithSynchronousMountOnAndroid(): Boolean = false
2929

30-
override fun completeReactInstanceCreationOnBgThreadOnAndroid(): Boolean = false
30+
override fun batchRenderingUpdatesInEventLoop(): Boolean = false
3131

32-
override fun disableEventLoopOnBridgeless(): Boolean = false
32+
override fun completeReactInstanceCreationOnBgThreadOnAndroid(): Boolean = false
3333

3434
override fun enableAlignItemsBaselineOnFabricIOS(): Boolean = true
3535

@@ -61,6 +61,8 @@ public open class ReactNativeFeatureFlagsDefaults : ReactNativeFeatureFlagsProvi
6161

6262
override fun enableLongTaskAPI(): Boolean = false
6363

64+
override fun enableMicrotasks(): Boolean = false
65+
6466
override fun enablePreciseSchedulingForPremountItemsOnAndroid(): Boolean = false
6567

6668
override fun enablePropsUpdateReconciliationAndroid(): Boolean = false
@@ -103,6 +105,8 @@ public open class ReactNativeFeatureFlagsDefaults : ReactNativeFeatureFlagsProvi
103105

104106
override fun useImmediateExecutorInAndroidBridgeless(): Boolean = false
105107

108+
override fun useModernRuntimeScheduler(): Boolean = false
109+
106110
override fun useNativeViewConfigsInBridgelessMode(): Boolean = false
107111

108112
override fun useOptimisedViewPreallocationOnAndroid(): Boolean = false

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<f90aa7d0ec4bf99554ffca7acdf35369>>
7+
* @generated SignedSource<<fb7bda2b8430d77435141daed4190e4a>>
88
*/
99

1010
/**
@@ -26,8 +26,8 @@ public class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcces
2626

2727
private var commonTestFlagCache: Boolean? = null
2828
private var allowRecursiveCommitsWithSynchronousMountOnAndroidCache: Boolean? = null
29+
private var batchRenderingUpdatesInEventLoopCache: Boolean? = null
2930
private var completeReactInstanceCreationOnBgThreadOnAndroidCache: Boolean? = null
30-
private var disableEventLoopOnBridgelessCache: Boolean? = null
3131
private var enableAlignItemsBaselineOnFabricIOSCache: Boolean? = null
3232
private var enableAndroidLineHeightCenteringCache: Boolean? = null
3333
private var enableBridgelessArchitectureCache: Boolean? = null
@@ -43,6 +43,7 @@ public class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcces
4343
private var enableLayoutAnimationsOnAndroidCache: Boolean? = null
4444
private var enableLayoutAnimationsOnIOSCache: Boolean? = null
4545
private var enableLongTaskAPICache: Boolean? = null
46+
private var enableMicrotasksCache: Boolean? = null
4647
private var enablePreciseSchedulingForPremountItemsOnAndroidCache: Boolean? = null
4748
private var enablePropsUpdateReconciliationAndroidCache: Boolean? = null
4849
private var enableReportEventPaintTimeCache: Boolean? = null
@@ -64,6 +65,7 @@ public class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcces
6465
private var traceTurboModulePromiseRejectionsOnAndroidCache: Boolean? = null
6566
private var useFabricInteropCache: Boolean? = null
6667
private var useImmediateExecutorInAndroidBridgelessCache: Boolean? = null
68+
private var useModernRuntimeSchedulerCache: Boolean? = null
6769
private var useNativeViewConfigsInBridgelessModeCache: Boolean? = null
6870
private var useOptimisedViewPreallocationOnAndroidCache: Boolean? = null
6971
private var useOptimizedEventBatchingOnAndroidCache: Boolean? = null
@@ -91,22 +93,22 @@ public class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcces
9193
return cached
9294
}
9395

94-
override fun completeReactInstanceCreationOnBgThreadOnAndroid(): Boolean {
95-
var cached = completeReactInstanceCreationOnBgThreadOnAndroidCache
96+
override fun batchRenderingUpdatesInEventLoop(): Boolean {
97+
var cached = batchRenderingUpdatesInEventLoopCache
9698
if (cached == null) {
97-
cached = currentProvider.completeReactInstanceCreationOnBgThreadOnAndroid()
98-
accessedFeatureFlags.add("completeReactInstanceCreationOnBgThreadOnAndroid")
99-
completeReactInstanceCreationOnBgThreadOnAndroidCache = cached
99+
cached = currentProvider.batchRenderingUpdatesInEventLoop()
100+
accessedFeatureFlags.add("batchRenderingUpdatesInEventLoop")
101+
batchRenderingUpdatesInEventLoopCache = cached
100102
}
101103
return cached
102104
}
103105

104-
override fun disableEventLoopOnBridgeless(): Boolean {
105-
var cached = disableEventLoopOnBridgelessCache
106+
override fun completeReactInstanceCreationOnBgThreadOnAndroid(): Boolean {
107+
var cached = completeReactInstanceCreationOnBgThreadOnAndroidCache
106108
if (cached == null) {
107-
cached = currentProvider.disableEventLoopOnBridgeless()
108-
accessedFeatureFlags.add("disableEventLoopOnBridgeless")
109-
disableEventLoopOnBridgelessCache = cached
109+
cached = currentProvider.completeReactInstanceCreationOnBgThreadOnAndroid()
110+
accessedFeatureFlags.add("completeReactInstanceCreationOnBgThreadOnAndroid")
111+
completeReactInstanceCreationOnBgThreadOnAndroidCache = cached
110112
}
111113
return cached
112114
}
@@ -261,6 +263,16 @@ public class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcces
261263
return cached
262264
}
263265

266+
override fun enableMicrotasks(): Boolean {
267+
var cached = enableMicrotasksCache
268+
if (cached == null) {
269+
cached = currentProvider.enableMicrotasks()
270+
accessedFeatureFlags.add("enableMicrotasks")
271+
enableMicrotasksCache = cached
272+
}
273+
return cached
274+
}
275+
264276
override fun enablePreciseSchedulingForPremountItemsOnAndroid(): Boolean {
265277
var cached = enablePreciseSchedulingForPremountItemsOnAndroidCache
266278
if (cached == null) {
@@ -471,6 +483,16 @@ public class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcces
471483
return cached
472484
}
473485

486+
override fun useModernRuntimeScheduler(): Boolean {
487+
var cached = useModernRuntimeSchedulerCache
488+
if (cached == null) {
489+
cached = currentProvider.useModernRuntimeScheduler()
490+
accessedFeatureFlags.add("useModernRuntimeScheduler")
491+
useModernRuntimeSchedulerCache = cached
492+
}
493+
return cached
494+
}
495+
474496
override fun useNativeViewConfigsInBridgelessMode(): Boolean {
475497
var cached = useNativeViewConfigsInBridgelessModeCache
476498
if (cached == null) {

0 commit comments

Comments
 (0)