Skip to content

Commit

Permalink
Attach react instance to react host immediately
Browse files Browse the repository at this point in the history
Summary:
## Changes
1. Store the react instance inside a private property (vs in the mReactInstanceTaskRef)
2. Attach the react instance to that property immediatley, after create

## Problems resolved
1. React host apis that use the instance (like ReactContext.getNativeModule()) will now also work **during** react native init. (see T191972567).
2. If exceptions get thrown during react instance init, the react instance will now get cleaned up (see test plan).

Changelog: [Internal]

Reviewed By: javache

Differential Revision: D58537535

fbshipit-source-id: fddf44d45b214b52a950e33d67ac6612a50ddcba
  • Loading branch information
RSNara authored and facebook-github-bot committed Jun 14, 2024
1 parent 2e2b71e commit 74d030d
Showing 1 changed file with 33 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -115,8 +115,10 @@ public class ReactHostImpl implements ReactHost {
private final Collection<ReactInstanceEventListener> mReactInstanceEventListeners =
Collections.synchronizedList(new ArrayList<>());

private final BridgelessAtomicRef<Task<ReactInstance>> mReactInstanceTaskRef =
// todo: T192399917 This no longer needs to store the react instance
private final BridgelessAtomicRef<Task<ReactInstance>> mCreateReactInstanceTaskRef =
new BridgelessAtomicRef<>(Task.forResult(null));
private @Nullable ReactInstance mReactInstance;

private final BridgelessAtomicRef<BridgelessReactContext> mBridgelessReactContextRef =
new BridgelessAtomicRef<>();
Expand Down Expand Up @@ -388,15 +390,14 @@ public MemoryPressureRouter getMemoryPressureRouter() {
}

/* package */ boolean isInstanceInitialized() {
final ReactInstance reactInstance = mReactInstanceTaskRef.get().getResult();
return reactInstance != null;
return mReactInstance != null;
}

@ThreadConfined(UI)
@Override
public boolean onBackPressed() {
UiThreadUtil.assertOnUiThread();
final ReactInstance reactInstance = mReactInstanceTaskRef.get().getResult();
final ReactInstance reactInstance = mReactInstance;
if (reactInstance == null) {
return false;
}
Expand All @@ -412,11 +413,9 @@ public boolean onBackPressed() {
}

public @Nullable ReactQueueConfiguration getReactQueueConfiguration() {
synchronized (mReactInstanceTaskRef) {
Task<ReactInstance> task = mReactInstanceTaskRef.get();
if (!task.isFaulted() && !task.isCancelled() && task.getResult() != null) {
return task.getResult().getReactQueueConfiguration();
}
final ReactInstance reactInstance = mReactInstance;
if (reactInstance != null) {
return reactInstance.getReactQueueConfiguration();
}
return null;
}
Expand Down Expand Up @@ -561,7 +560,7 @@ private void setCurrentActivity(@Nullable Activity activity) {
* BlackHoleEventDispatcher}.
*/
/* package */ EventDispatcher getEventDispatcher() {
final ReactInstance reactInstance = mReactInstanceTaskRef.get().getResult();
final ReactInstance reactInstance = mReactInstance;
if (reactInstance == null) {
return BlackHoleEventDispatcher.get();
}
Expand All @@ -572,23 +571,23 @@ private void setCurrentActivity(@Nullable Activity activity) {
/* package */
@Nullable
FabricUIManager getUIManager() {
final ReactInstance reactInstance = mReactInstanceTaskRef.get().getResult();
final ReactInstance reactInstance = mReactInstance;
if (reactInstance == null) {
return null;
}
return reactInstance.getUIManager();
}

/* package */ <T extends NativeModule> boolean hasNativeModule(Class<T> nativeModuleInterface) {
final ReactInstance reactInstance = mReactInstanceTaskRef.get().getResult();
final ReactInstance reactInstance = mReactInstance;
if (reactInstance != null) {
return reactInstance.hasNativeModule(nativeModuleInterface);
}
return false;
}

/* package */ Collection<NativeModule> getNativeModules() {
final ReactInstance reactInstance = mReactInstanceTaskRef.get().getResult();
final ReactInstance reactInstance = mReactInstance;
if (reactInstance != null) {
return reactInstance.getNativeModules();
}
Expand All @@ -606,7 +605,7 @@ <T extends NativeModule> T getNativeModule(Class<T> nativeModuleInterface) {
+ " disabled"));
}

final ReactInstance reactInstance = mReactInstanceTaskRef.get().getResult();
final ReactInstance reactInstance = mReactInstance;
if (reactInstance != null) {
return reactInstance.getNativeModule(nativeModuleInterface);
}
Expand All @@ -616,7 +615,7 @@ <T extends NativeModule> T getNativeModule(Class<T> nativeModuleInterface) {
/* package */
@Nullable
NativeModule getNativeModule(String nativeModuleName) {
final ReactInstance reactInstance = mReactInstanceTaskRef.get().getResult();
final ReactInstance reactInstance = mReactInstance;
if (reactInstance != null) {
return reactInstance.getNativeModule(nativeModuleName);
}
Expand All @@ -628,7 +627,7 @@ NativeModule getNativeModule(String nativeModuleName) {
RuntimeExecutor getRuntimeExecutor() {
final String method = "getRuntimeExecutor()";

final ReactInstance reactInstance = mReactInstanceTaskRef.get().getResult();
final ReactInstance reactInstance = mReactInstance;
if (reactInstance != null) {
return reactInstance.getBufferedRuntimeExecutor();
}
Expand All @@ -641,7 +640,7 @@ RuntimeExecutor getRuntimeExecutor() {
CallInvokerHolder getJSCallInvokerHolder() {
final String method = "getJSCallInvokerHolder()";

final ReactInstance reactInstance = mReactInstanceTaskRef.get().getResult();
final ReactInstance reactInstance = mReactInstance;
if (reactInstance != null) {
return reactInstance.getJSCallInvokerHolder();
}
Expand Down Expand Up @@ -736,7 +735,7 @@ public void onConfigurationChanged(Context updatedContext) {

@Nullable
JavaScriptContextHolder getJavaScriptContextHolder() {
final ReactInstance reactInstance = mReactInstanceTaskRef.get().getResult();
final ReactInstance reactInstance = mReactInstance;
if (reactInstance != null) {
return reactInstance.getJavaScriptContextHolder();
}
Expand Down Expand Up @@ -937,11 +936,11 @@ private Task<Boolean> callWithExistingReactInstance(
executor = getDefaultReactInstanceExecutor();
}

return mReactInstanceTaskRef
return mCreateReactInstanceTaskRef
.get()
.onSuccess(
task -> {
final ReactInstance reactInstance = task.getResult();
final ReactInstance reactInstance = mReactInstance;
if (reactInstance == null) {
raiseSoftException(method, "Execute: reactInstance is null. Dropping work.");
return FALSE;
Expand All @@ -967,7 +966,7 @@ private Task<Void> callAfterGetOrCreateReactInstance(
return getOrCreateReactInstance()
.onSuccess(
task -> {
final ReactInstance reactInstance = task.getResult();
final ReactInstance reactInstance = mReactInstance;
if (reactInstance == null) {
raiseSoftException(method, "Execute: reactInstance is null. Dropping work.");
return null;
Expand Down Expand Up @@ -1047,7 +1046,7 @@ private Task<ReactInstance> getOrCreateReactInstanceTask() {
final String method = "getOrCreateReactInstanceTask()";
log(method);

return mReactInstanceTaskRef.getOrCreate(
return mCreateReactInstanceTaskRef.getOrCreate(
() -> {
log(method, "Start");
ReactMarker.logMarker(
Expand All @@ -1072,6 +1071,7 @@ private Task<ReactInstance> getOrCreateReactInstanceTask() {
mReactJsExceptionHandler,
mUseDevSupport,
getOrCreateReactHostInspectorTarget());
mReactInstance = instance;

MemoryPressureListener memoryPressureListener =
createMemoryPressureListener(instance);
Expand Down Expand Up @@ -1284,7 +1284,7 @@ private ReactInstanceTaskUnwrapper createReactInstanceUnwrapper(

return (task, stage) -> {
final ReactInstance reactInstance = task.getResult();
final ReactInstance currentReactInstance = mReactInstanceTaskRef.get().getResult();
final ReactInstance currentReactInstance = mReactInstance;

final String stageLabel = "Stage: " + stage;
final String reasonLabel = tag + " reason: " + reason;
Expand Down Expand Up @@ -1351,7 +1351,7 @@ private Task<ReactInstance> getOrCreateReloadTask(String reason) {

if (mReloadTask == null) {
mReloadTask =
mReactInstanceTaskRef
mCreateReactInstanceTaskRef
.get()
.continueWithTask(
(task) -> {
Expand Down Expand Up @@ -1448,7 +1448,10 @@ private Task<ReactInstance> getOrCreateReloadTask(String reason) {
mBridgelessReactContextRef.reset();

log(method, "Resetting ReactInstance task ref");
mReactInstanceTaskRef.reset();
mCreateReactInstanceTaskRef.reset();

log(method, "Resetting ReactInstance ptr");
mReactInstance = null;

log(method, "Resetting preload task ref");
mStartTask = null;
Expand Down Expand Up @@ -1527,7 +1530,7 @@ private Task<Void> getOrCreateDestroyTask(final String reason, @Nullable Excepti

if (mDestroyTask == null) {
mDestroyTask =
mReactInstanceTaskRef
mCreateReactInstanceTaskRef
.get()
.continueWithTask(
task -> {
Expand Down Expand Up @@ -1638,7 +1641,10 @@ private Task<Void> getOrCreateDestroyTask(final String reason, @Nullable Excepti
mBridgelessReactContextRef.reset();

log(method, "Resetting ReactInstance task ref");
mReactInstanceTaskRef.reset();
mCreateReactInstanceTaskRef.reset();

log(method, "Resetting ReactInstance ptr");
mReactInstance = null;

log(method, "Resetting Preload task ref");
mStartTask = null;
Expand Down

0 comments on commit 74d030d

Please sign in to comment.