Add option to use RuntimeScheduler in TurboModules

Summary: changelog: [internal]

Reviewed By: RSNara

Differential Revision: D31145372

fbshipit-source-id: b1d9473d5006d055d1116f71f65899293fb85c56
This commit is contained in:
Samuel Susla
2021-09-28 09:21:55 -07:00
committed by Facebook GitHub Bot
parent 3516090174
commit ea3e244668
8 changed files with 61 additions and 32 deletions
@@ -1368,10 +1368,6 @@ public class ReactInstanceManager {
}
}
if (ReactFeatureFlags.enableRuntimeScheduler) {
catalystInstance.installRuntimeScheduler();
}
if (mJSIModulePackage != null) {
catalystInstance.addJSIModules(
mJSIModulePackage.getJSIModules(
@@ -113,8 +113,6 @@ public interface CatalystInstance
RuntimeScheduler getRuntimeScheduler();
void installRuntimeScheduler();
void addJSIModules(List<JSIModuleSpec> jsiModules);
/**
@@ -108,7 +108,8 @@ public class CatalystInstanceImpl implements CatalystInstance {
// C++ parts
private final HybridData mHybridData;
private static native HybridData initHybrid();
private static native HybridData initHybrid(
boolean enableRuntimeScheduler, boolean enableRuntimeSchedulerInTurboModule);
public native CallInvokerHolderImpl getJSCallInvokerHolder();
@@ -123,7 +124,15 @@ public class CatalystInstanceImpl implements CatalystInstance {
FLog.d(ReactConstants.TAG, "Initializing React Xplat Bridge.");
Systrace.beginSection(TRACE_TAG_REACT_JAVA_BRIDGE, "createCatalystInstanceImpl");
mHybridData = initHybrid();
if (ReactFeatureFlags.enableRuntimeSchedulerInTurboModule
&& !ReactFeatureFlags.enableRuntimeScheduler) {
Assertions.assertUnreachable();
}
mHybridData =
initHybrid(
ReactFeatureFlags.enableRuntimeScheduler,
ReactFeatureFlags.enableRuntimeSchedulerInTurboModule);
mReactQueueConfiguration =
ReactQueueConfigurationImpl.create(
@@ -560,8 +569,6 @@ public class CatalystInstanceImpl implements CatalystInstance {
public native RuntimeScheduler getRuntimeScheduler();
public native void installRuntimeScheduler();
@Override
public void addJSIModules(List<JSIModuleSpec> jsiModules) {
mJSIModuleRegistry.registerModules(jsiModules);
@@ -72,6 +72,8 @@ public class ReactFeatureFlags {
public static boolean enableRuntimeScheduler = false;
public static boolean enableRuntimeSchedulerInTurboModule = false;
/** Enables a more aggressive cleanup during destruction of ReactContext */
public static boolean enableReactContextCleanupFix = false;
@@ -29,6 +29,7 @@
#include <glog/logging.h>
#include <react/renderer/runtimescheduler/RuntimeScheduler.h>
#include <react/renderer/runtimescheduler/RuntimeSchedulerBinding.h>
#include <react/renderer/runtimescheduler/RuntimeSchedulerCallInvoker.h>
#include <logger/react_native_log.h>
@@ -92,12 +93,21 @@ class JInstanceCallback : public InstanceCallback {
} // namespace
jni::local_ref<CatalystInstanceImpl::jhybriddata>
CatalystInstanceImpl::initHybrid(jni::alias_ref<jclass>) {
return makeCxxInstance();
CatalystInstanceImpl::initHybrid(
jni::alias_ref<jclass>,
bool enableRuntimeScheduler,
bool enableRuntimeSchedulerInTurboModule) {
return makeCxxInstance(
enableRuntimeScheduler, enableRuntimeSchedulerInTurboModule);
}
CatalystInstanceImpl::CatalystInstanceImpl()
: instance_(std::make_unique<Instance>()) {}
CatalystInstanceImpl::CatalystInstanceImpl(
bool enableRuntimeScheduler,
bool enableRuntimeSchedulerInTurboModule)
: instance_(std::make_unique<Instance>()),
enableRuntimeScheduler_(enableRuntimeScheduler),
enableRuntimeSchedulerInTurboModule_(
enableRuntimeScheduler && enableRuntimeSchedulerInTurboModule) {}
void CatalystInstanceImpl::warnOnLegacyNativeModuleSystemUse() {
CxxNativeModule::setShouldWarnOnUse(true);
@@ -140,9 +150,6 @@ void CatalystInstanceImpl::registerNatives() {
"getRuntimeExecutor", CatalystInstanceImpl::getRuntimeExecutor),
makeNativeMethod(
"getRuntimeScheduler", CatalystInstanceImpl::getRuntimeScheduler),
makeNativeMethod(
"installRuntimeScheduler",
CatalystInstanceImpl::installRuntimeScheduler),
makeNativeMethod(
"warnOnLegacyNativeModuleSystemUse",
CatalystInstanceImpl::warnOnLegacyNativeModuleSystemUse),
@@ -347,10 +354,18 @@ void CatalystInstanceImpl::handleMemoryPressure(int pressureLevel) {
jni::alias_ref<CallInvokerHolder::javaobject>
CatalystInstanceImpl::getJSCallInvokerHolder() {
if (!jsCallInvokerHolder_) {
jsCallInvokerHolder_ = jni::make_global(
CallInvokerHolder::newObjectCxxArgs(instance_->getJSCallInvoker()));
if (enableRuntimeSchedulerInTurboModule_) {
auto runtimeScheduler = getRuntimeScheduler();
auto runtimeSchedulerCallInvoker =
std::make_shared<RuntimeSchedulerCallInvoker>(
runtimeScheduler->cthis()->get());
jsCallInvokerHolder_ = jni::make_global(
CallInvokerHolder::newObjectCxxArgs(runtimeSchedulerCallInvoker));
} else {
jsCallInvokerHolder_ = jni::make_global(
CallInvokerHolder::newObjectCxxArgs(instance_->getJSCallInvoker()));
}
}
return jsCallInvokerHolder_;
}
@@ -397,11 +412,7 @@ CatalystInstanceImpl::getRuntimeExecutor() {
jni::alias_ref<JRuntimeScheduler::javaobject>
CatalystInstanceImpl::getRuntimeScheduler() {
return runtimeScheduler_;
}
void CatalystInstanceImpl::installRuntimeScheduler() {
if (!runtimeScheduler_) {
if (enableRuntimeScheduler_ && !runtimeScheduler_) {
auto runtimeExecutor = instance_->getRuntimeExecutor();
auto runtimeScheduler = std::make_shared<RuntimeScheduler>(runtimeExecutor);
@@ -413,6 +424,8 @@ void CatalystInstanceImpl::installRuntimeScheduler() {
runtime, runtimeScheduler);
});
}
return runtimeScheduler_;
}
} // namespace react
@@ -37,7 +37,10 @@ class CatalystInstanceImpl : public jni::HybridClass<CatalystInstanceImpl> {
static constexpr auto kJavaDescriptor =
"Lcom/facebook/react/bridge/CatalystInstanceImpl;";
static jni::local_ref<jhybriddata> initHybrid(jni::alias_ref<jclass>);
static jni::local_ref<jhybriddata> initHybrid(
jni::alias_ref<jclass>,
bool enableRuntimeScheduler,
bool enableRuntimeSchedulerInTurboModule);
static void registerNatives();
@@ -48,7 +51,9 @@ class CatalystInstanceImpl : public jni::HybridClass<CatalystInstanceImpl> {
private:
friend HybridBase;
CatalystInstanceImpl();
CatalystInstanceImpl(
bool enableRuntimeScheduler,
bool enableRuntimeSchedulerInTurboModule);
void initializeBridge(
jni::alias_ref<ReactCallback::javaobject> callback,
@@ -100,11 +105,12 @@ class CatalystInstanceImpl : public jni::HybridClass<CatalystInstanceImpl> {
jni::alias_ref<CallInvokerHolder::javaobject> getNativeCallInvokerHolder();
jni::alias_ref<JRuntimeExecutor::javaobject> getRuntimeExecutor();
jni::alias_ref<JRuntimeScheduler::javaobject> getRuntimeScheduler();
void installRuntimeScheduler();
void setGlobalVariable(std::string propName, std::string &&jsonValue);
jlong getJavaScriptContext();
void handleMemoryPressure(int pressureLevel);
void createAndInstallRuntimeSchedulerIfNecessary();
// This should be the only long-lived strong reference, but every C++ class
// will have a weak reference.
std::shared_ptr<Instance> instance_;
@@ -114,6 +120,9 @@ class CatalystInstanceImpl : public jni::HybridClass<CatalystInstanceImpl> {
jni::global_ref<CallInvokerHolder::javaobject> nativeCallInvokerHolder_;
jni::global_ref<JRuntimeExecutor::javaobject> runtimeExecutor_;
jni::global_ref<JRuntimeScheduler::javaobject> runtimeScheduler_;
bool const enableRuntimeScheduler_;
bool const enableRuntimeSchedulerInTurboModule_;
};
} // namespace react