Skip to content

Commit 5c4f145

Browse files
RSNarafacebook-github-bot
authored andcommitted
Roll out TurboModule Promise Async Dispatch
Summary: ## Context The legacy NativeModule infra implements promise methods using [async NativeModule method calls](https://fburl.com/diffusion/tpkff6vg). In the TurboModule infra, promise methods [treat as sync methods](https://fburl.com/diffusion/yde7xw71), and executed directly on the JavaScript thread. This experiment makes TurboModule promise methods async, and dispatches them to the NativeModules thread, when they're executed from JavaScript. Reviewed By: fkgozali Differential Revision: D25623192 fbshipit-source-id: 2b50d771c5272af3b6edf150054bb3e80cab0040
1 parent 40115d8 commit 5c4f145

File tree

5 files changed

+45
-81
lines changed

5 files changed

+45
-81
lines changed

ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/TurboModuleManager.java

-2
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,6 @@ public TurboModuleManager(
6161
(CallInvokerHolderImpl) jsCallInvokerHolder,
6262
(CallInvokerHolderImpl) nativeCallInvokerHolder,
6363
delegate,
64-
ReactFeatureFlags.enableTurboModulePromiseAsyncDispatch,
6564
ReactFeatureFlags.useTurboModuleJSCodegen);
6665
installJSIBindings();
6766

@@ -295,7 +294,6 @@ private native HybridData initHybrid(
295294
CallInvokerHolderImpl jsCallInvokerHolder,
296295
CallInvokerHolderImpl nativeCallInvokerHolder,
297296
TurboModuleManagerDelegate tmmDelegate,
298-
boolean enablePromiseAsyncDispatch,
299297
boolean enableTurboModuleJSCodegen);
300298

301299
private native void installJSIBindings();

ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/jni/ReactCommon/TurboModuleManager.cpp

-3
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,10 @@ jni::local_ref<TurboModuleManager::jhybriddata> TurboModuleManager::initHybrid(
4343
jni::alias_ref<CallInvokerHolder::javaobject> jsCallInvokerHolder,
4444
jni::alias_ref<CallInvokerHolder::javaobject> nativeCallInvokerHolder,
4545
jni::alias_ref<TurboModuleManagerDelegate::javaobject> delegate,
46-
bool enablePromiseAsyncDispatch,
4746
bool enableJSCodegen) {
4847
auto jsCallInvoker = jsCallInvokerHolder->cthis()->getCallInvoker();
4948
auto nativeCallInvoker = nativeCallInvokerHolder->cthis()->getCallInvoker();
5049

51-
JavaTurboModule::enablePromiseAsyncDispatch(enablePromiseAsyncDispatch);
52-
5350
return makeCxxInstance(
5451
jThis,
5552
runtimeExecutor->cthis()->get(),

ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/jni/ReactCommon/TurboModuleManager.h

-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ class TurboModuleManager : public jni::HybridClass<TurboModuleManager> {
3333
jni::alias_ref<CallInvokerHolder::javaobject> jsCallInvokerHolder,
3434
jni::alias_ref<CallInvokerHolder::javaobject> nativeCallInvokerHolder,
3535
jni::alias_ref<TurboModuleManagerDelegate::javaobject> delegate,
36-
bool enablePromiseAsyncDispatch,
3736
bool enableJSCodegen);
3837
static void registerNatives();
3938

ReactCommon/react/nativemodule/core/platform/android/ReactCommon/JavaTurboModule.cpp

+45-69
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,6 @@ JavaTurboModule::~JavaTurboModule() {
5151
});
5252
}
5353

54-
bool JavaTurboModule::isPromiseAsyncDispatchEnabled_ = false;
55-
void JavaTurboModule::enablePromiseAsyncDispatch(bool enable) {
56-
isPromiseAsyncDispatchEnabled_ = enable;
57-
}
58-
5954
JavaTurboModule::JavaTurboModule(
6055
const InitParams &params,
6156
TurboModuleSchema &&schema)
@@ -322,8 +317,7 @@ JNIArgs JavaTurboModule::convertJSIArgsToJNIArgs(
322317

323318
auto makeGlobalIfNecessary =
324319
[&globalRefs, env, valueKind](jobject obj) -> jobject {
325-
if (valueKind == VoidKind ||
326-
(valueKind == PromiseKind && isPromiseAsyncDispatchEnabled_)) {
320+
if (valueKind == VoidKind || valueKind == PromiseKind) {
327321
jobject globalObj = env->NewGlobalRef(obj);
328322
globalRefs.push_back(globalObj);
329323
env->DeleteLocalRef(obj);
@@ -491,9 +485,7 @@ jsi::Value JavaTurboModule::invokeJavaMethod(
491485
const char *methodName = methodNameStr.c_str();
492486
const char *moduleName = name_.c_str();
493487

494-
bool isMethodSync =
495-
!(valueKind == VoidKind ||
496-
(valueKind == PromiseKind && isPromiseAsyncDispatchEnabled_));
488+
bool isMethodSync = !(valueKind == VoidKind || valueKind == PromiseKind);
497489

498490
if (isMethodSync) {
499491
TMPL::syncMethodCallStart(moduleName, methodName);
@@ -834,60 +826,48 @@ jsi::Value JavaTurboModule::invokeJavaMethod(
834826
const char *moduleName = moduleNameStr.c_str();
835827
const char *methodName = methodNameStr.c_str();
836828

837-
if (isPromiseAsyncDispatchEnabled_) {
838-
jobject globalPromise = env->NewGlobalRef(promise);
839-
840-
globalRefs.push_back(globalPromise);
841-
env->DeleteLocalRef(promise);
842-
843-
jargs[argCount].l = globalPromise;
844-
TMPL::asyncMethodCallArgConversionEnd(moduleName, methodName);
845-
TMPL::asyncMethodCallDispatch(moduleName, methodName);
846-
847-
nativeInvoker_->invokeAsync(
848-
[jargs,
849-
globalRefs,
850-
methodID,
851-
instance_ = instance_,
852-
moduleNameStr,
853-
methodNameStr,
854-
id = getUniqueId()]() mutable -> void {
855-
/**
856-
* TODO(ramanpreet): Why do we have to require the
857-
* environment again? Why does JNI crash when we use the env
858-
* from the upper scope?
859-
*/
860-
JNIEnv *env = jni::Environment::current();
861-
const char *moduleName = moduleNameStr.c_str();
862-
const char *methodName = methodNameStr.c_str();
863-
864-
TMPL::asyncMethodCallExecutionStart(
865-
moduleName, methodName, id);
866-
env->CallVoidMethodA(
867-
instance_.get(), methodID, jargs.data());
868-
try {
869-
FACEBOOK_JNI_THROW_PENDING_EXCEPTION();
870-
} catch (...) {
871-
TMPL::asyncMethodCallExecutionFail(
872-
moduleName, methodName, id);
873-
throw;
874-
}
875-
876-
for (auto globalRef : globalRefs) {
877-
env->DeleteGlobalRef(globalRef);
878-
}
879-
TMPL::asyncMethodCallExecutionEnd(
829+
jobject globalPromise = env->NewGlobalRef(promise);
830+
831+
globalRefs.push_back(globalPromise);
832+
env->DeleteLocalRef(promise);
833+
834+
jargs[argCount].l = globalPromise;
835+
TMPL::asyncMethodCallArgConversionEnd(moduleName, methodName);
836+
TMPL::asyncMethodCallDispatch(moduleName, methodName);
837+
838+
nativeInvoker_->invokeAsync(
839+
[jargs,
840+
globalRefs,
841+
methodID,
842+
instance_ = instance_,
843+
moduleNameStr,
844+
methodNameStr,
845+
id = getUniqueId()]() mutable -> void {
846+
/**
847+
* TODO(ramanpreet): Why do we have to require the
848+
* environment again? Why does JNI crash when we use the env
849+
* from the upper scope?
850+
*/
851+
JNIEnv *env = jni::Environment::current();
852+
const char *moduleName = moduleNameStr.c_str();
853+
const char *methodName = methodNameStr.c_str();
854+
855+
TMPL::asyncMethodCallExecutionStart(
856+
moduleName, methodName, id);
857+
env->CallVoidMethodA(instance_.get(), methodID, jargs.data());
858+
try {
859+
FACEBOOK_JNI_THROW_PENDING_EXCEPTION();
860+
} catch (...) {
861+
TMPL::asyncMethodCallExecutionFail(
880862
moduleName, methodName, id);
881-
});
882-
883-
} else {
884-
jargs[argCount].l = promise;
885-
TMPL::syncMethodCallArgConversionEnd(moduleName, methodName);
886-
TMPL::syncMethodCallExecutionStart(moduleName, methodName);
887-
env->CallVoidMethodA(instance_.get(), methodID, jargs.data());
888-
TMPL::syncMethodCallExecutionEnd(moduleName, methodName);
889-
TMPL::syncMethodCallReturnConversionStart(moduleName, methodName);
890-
}
863+
throw;
864+
}
865+
866+
for (auto globalRef : globalRefs) {
867+
env->DeleteGlobalRef(globalRef);
868+
}
869+
TMPL::asyncMethodCallExecutionEnd(moduleName, methodName, id);
870+
});
891871

892872
return jsi::Value::undefined();
893873
});
@@ -896,12 +876,8 @@ jsi::Value JavaTurboModule::invokeJavaMethod(
896876
Promise.callAsConstructor(runtime, promiseConstructorArg);
897877
checkJNIErrorForMethodCall();
898878

899-
if (isPromiseAsyncDispatchEnabled_) {
900-
TMPL::asyncMethodCallEnd(moduleName, methodName);
901-
} else {
902-
TMPL::syncMethodCallReturnConversionEnd(moduleName, methodName);
903-
TMPL::syncMethodCallEnd(moduleName, methodName);
904-
}
879+
TMPL::asyncMethodCallEnd(moduleName, methodName);
880+
905881
return promise;
906882
}
907883
default:

ReactCommon/react/nativemodule/core/platform/android/ReactCommon/JavaTurboModule.h

-6
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@ class JSI_EXPORT JavaTurboModule : public TurboModule {
5555
const jsi::Value *args,
5656
size_t argCount);
5757

58-
static void enablePromiseAsyncDispatch(bool enable);
5958
jsi::Value get(jsi::Runtime &runtime, const jsi::PropNameID &propName)
6059
override;
6160

@@ -64,11 +63,6 @@ class JSI_EXPORT JavaTurboModule : public TurboModule {
6463
std::shared_ptr<CallInvoker> nativeInvoker_;
6564
folly::Optional<TurboModuleSchema> turboModuleSchema_;
6665

67-
/**
68-
* Experiments
69-
*/
70-
static bool isPromiseAsyncDispatchEnabled_;
71-
7266
JNIArgs convertJSIArgsToJNIArgs(
7367
JNIEnv *env,
7468
jsi::Runtime &rt,

0 commit comments

Comments
 (0)