From 2e6afdc550f3845f342ccfef05390e88e7b8fc8c Mon Sep 17 00:00:00 2001 From: Ramanpreet Nara Date: Tue, 9 Jan 2024 19:07:01 -0800 Subject: [PATCH] Refactor: ReactHost: Make getOrCreateStartTask confined to the ReactHost thread (#42167) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/42167 Changelog: [Internal] Reviewed By: mdvacca Differential Revision: D52495534 fbshipit-source-id: bab3158dfdcf642efd5afed05ced27fb0d2594f7 --- .../facebook/react/runtime/ReactHostImpl.java | 99 +++++++++---------- 1 file changed, 45 insertions(+), 54 deletions(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostImpl.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostImpl.java index 7a76b8176d3..cb97a34a523 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostImpl.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostImpl.java @@ -202,10 +202,11 @@ public class ReactHostImpl implements ReactHost { @Override public TaskInterface start() { if (ReactFeatureFlags.enableBridgelessArchitectureNewCreateReloadDestroy) { - return newGetOrCreateStartTask(); + return Task.call(this::newGetOrCreateStartTask, mBGExecutor) + .continueWithTask(Task::getResult); } - return oldGetOrCreateStartTask(); + return Task.call(this::oldGetOrCreateStartTask, mBGExecutor).continueWithTask(Task::getResult); } /** Initialize and run a React Native surface in a background without mounting real views. */ @@ -719,63 +720,53 @@ public class ReactHostImpl implements ReactHost { @ThreadConfined("ReactHost") private @Nullable Task mStartTask = null; + @ThreadConfined("ReactHost") private Task oldGetOrCreateStartTask() { - final String method = "oldGetOrCreateStartTask()"; - return Task.call( - () -> { - if (mStartTask == null) { - log(method, "Schedule"); - mStartTask = - getOrCreateReactInstance() - .continueWithTask( - task -> { - if (task.isFaulted()) { - destroy( - "oldGetOrCreateStartTask() failure: " - + task.getError().getMessage(), - task.getError()); - mReactHostDelegate.handleInstanceException(task.getError()); - } + if (mStartTask == null) { + final String method = "oldGetOrCreateStartTask()"; + log(method, "Schedule"); + mStartTask = + getOrCreateReactInstance() + .continueWithTask( + task -> { + if (task.isFaulted()) { + destroy( + "oldGetOrCreateStartTask() failure: " + task.getError().getMessage(), + task.getError()); + mReactHostDelegate.handleInstanceException(task.getError()); + } - return task; - }, - mBGExecutor) - .makeVoid(); - } - return mStartTask; - }, - mBGExecutor) - .continueWithTask(Task::getResult); + return task; + }, + mBGExecutor) + .makeVoid(); + } + return mStartTask; } + @ThreadConfined("ReactHost") private Task newGetOrCreateStartTask() { - final String method = "newGetOrCreateStartTask()"; - return Task.call( - () -> { - if (mStartTask == null) { - log(method, "Schedule"); - mStartTask = - waitThenCallNewGetOrCreateReactInstanceTask() - .continueWithTask( - (task) -> { - if (task.isFaulted()) { - mReactHostDelegate.handleInstanceException(task.getError()); - // Wait for destroy to finish - return newGetOrCreateDestroyTask( - "newGetOrCreateStartTask() failure: " - + task.getError().getMessage(), - task.getError()) - .continueWithTask(destroyTask -> Task.forError(task.getError())) - .makeVoid(); - } - return task.makeVoid(); - }, - mBGExecutor); - } - return mStartTask; - }, - mBGExecutor) - .continueWithTask(Task::getResult); + if (mStartTask == null) { + final String method = "newGetOrCreateStartTask()"; + log(method, "Schedule"); + mStartTask = + waitThenCallNewGetOrCreateReactInstanceTask() + .continueWithTask( + (task) -> { + if (task.isFaulted()) { + mReactHostDelegate.handleInstanceException(task.getError()); + // Wait for destroy to finish + return newGetOrCreateDestroyTask( + "newGetOrCreateStartTask() failure: " + task.getError().getMessage(), + task.getError()) + .continueWithTask(destroyTask -> Task.forError(task.getError())) + .makeVoid(); + } + return task.makeVoid(); + }, + mBGExecutor); + } + return mStartTask; } @ThreadConfined(UI)