Skip to content

Commit

Permalink
Make sure the Native RuntimeScheduler is initialized on Old Arch (fac…
Browse files Browse the repository at this point in the history
…ebook#37517)

Summary:
Pull Request resolved: facebook#37517

Fixes facebook#35778

We got reports of regressions on `useEffect` starting from 0.69+ when on Hermes.

The issue seems to be caused by a bump of the `scheduler` package from 0.20 to 0.21.
In scheduler@0.21, the method `setImmediate` gets called if available
(see facebook/react#20834). This causes React Native to use Microtasks
which ends up in changing the semantic of useEffect.

The solution is to use the Native RuntimeScheduler properly.
On Paper specifically, we never initialized it as it's effectively initialized by the
TurboModuleManagerDelegate. Here I trigger the initialization of it on Paper as well.

Changelog:
[Android] [Fixed] - Make sure the Native RuntimeScheduler is initialized on Old Arch

Reviewed By: sammy-SC

Differential Revision: D46024807

fbshipit-source-id: da117769aaa60d1048e6ec50503c74eed6a0df3e
  • Loading branch information
cortinico authored and facebook-github-bot committed May 22, 2023
1 parent e93bc9b commit e41f871
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1358,6 +1358,15 @@ private ReactApplicationContext createReactContext(

reactContext.initializeWithInstance(catalystInstance);

if (ReactFeatureFlags.unstable_useRuntimeSchedulerAlways) {
// On Old Architecture, we need to initialize the Native Runtime Scheduler so that
// the `nativeRuntimeScheduler` object is registered on JS.
// On New Architecture, this is normally triggered by instantiate a TurboModuleManager.
// Here we invoke getRuntimeScheduler() to trigger the creation of it regardless of the
// architecture so it will always be there.
catalystInstance.getRuntimeScheduler();
}

if (ReactFeatureFlags.useTurboModules && mTMMDelegateBuilder != null) {
TurboModuleManagerDelegate tmmDelegate =
mTMMDelegateBuilder
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,13 @@ public class ReactFeatureFlags {
*/
public static volatile boolean unstable_useFabricInterop = false;

/**
* Should this application always use the Native RuntimeScheduler? If yes, we'll be instantiating
* it over all the architectures (both Old and New). This is intentionally set to true as we want
* to use it more as a kill-switch to turn off this feature to potentially debug issues.
*/
public static volatile boolean unstable_useRuntimeSchedulerAlways = true;

/**
* Feature flag to enable the new bridgeless architecture. Note: Enabling this will force enable
* the following flags: `useTurboModules` & `enableFabricRenderer`.
Expand Down

0 comments on commit e41f871

Please sign in to comment.