Stop sharing LongLivedObjectCollection with the bridge

Summary:
This is the Android analogue to D30019833.

Changelog: [Internal]

Reviewed By: p-sun

Differential Revision: D30029295

fbshipit-source-id: 13df0dfb915697eeedcc527dcdb6c246e89afb0c
This commit is contained in:
Ramanpreet Nara
2021-08-02 11:22:22 -07:00
committed by Facebook GitHub Bot
parent 32bfd7a857
commit 034c6dfe34
6 changed files with 110 additions and 21 deletions
@@ -28,6 +28,26 @@ public class ReactFeatureFlags {
/** Should we dispatch TurboModule methods with promise returns to the NativeModules thread? */
public static volatile boolean enableTurboModulePromiseAsyncDispatch = false;
/**
* Experiment:
*
* <p>Bridge and Bridgeless mode can run concurrently. This means that there can be two
* TurboModule systems alive at the same time.
*
* <p>The TurboModule system stores all JS callbacks in a global LongLivedObjectCollection. This
* collection is cleared when the JS VM is torn down. Implication: Tearing down the bridge JSVM
* invalidates the bridgeless JSVM's callbacks, and vice versa.
*
* <p>useGlobalCallbackCleanupScopeUsingRetainJSCallback => Use a retainJSCallbacks lambda to
* store jsi::Functions into the global LongLivedObjectCollection
*
* <p>useTurboModuleManagerCallbackCleanupScope => Use a retainJSCallbacks labmda to store
* jsi::Functions into a LongLivedObjectCollection owned by the TurboModuleManager
*/
public static boolean useGlobalCallbackCleanupScopeUsingRetainJSCallback = false;
public static boolean useTurboModuleManagerCallbackCleanupScope = false;
/** This feature flag enables logs for Fabric */
public static boolean enableFabricLogs = false;
@@ -16,6 +16,7 @@ import com.facebook.proguard.annotations.DoNotStrip;
import com.facebook.react.bridge.CxxModuleWrapper;
import com.facebook.react.bridge.JSIModule;
import com.facebook.react.bridge.RuntimeExecutor;
import com.facebook.react.config.ReactFeatureFlags;
import com.facebook.react.turbomodule.core.interfaces.CallInvokerHolder;
import com.facebook.react.turbomodule.core.interfaces.TurboModule;
import com.facebook.react.turbomodule.core.interfaces.TurboModuleRegistry;
@@ -58,7 +59,9 @@ public class TurboModuleManager implements JSIModule, TurboModuleRegistry {
runtimeExecutor,
(CallInvokerHolderImpl) jsCallInvokerHolder,
(CallInvokerHolderImpl) nativeCallInvokerHolder,
delegate);
delegate,
ReactFeatureFlags.useGlobalCallbackCleanupScopeUsingRetainJSCallback,
ReactFeatureFlags.useTurboModuleManagerCallbackCleanupScope);
installJSIBindings();
mEagerInitModuleNames =
@@ -290,7 +293,9 @@ public class TurboModuleManager implements JSIModule, TurboModuleRegistry {
RuntimeExecutor runtimeExecutor,
CallInvokerHolderImpl jsCallInvokerHolder,
CallInvokerHolderImpl nativeCallInvokerHolder,
TurboModuleManagerDelegate tmmDelegate);
TurboModuleManagerDelegate tmmDelegate,
boolean useGlobalCallbackCleanupScopeUsingRetainJSCallback,
boolean useTurboModuleManagerCallbackCleanupScope);
private native void installJSIBindings();
@@ -26,20 +26,44 @@ TurboModuleManager::TurboModuleManager(
RuntimeExecutor runtimeExecutor,
std::shared_ptr<CallInvoker> jsCallInvoker,
std::shared_ptr<CallInvoker> nativeCallInvoker,
jni::alias_ref<TurboModuleManagerDelegate::javaobject> delegate)
jni::alias_ref<TurboModuleManagerDelegate::javaobject> delegate,
bool useGlobalCallbackCleanupScopeUsingRetainJSCallback,
bool useTurboModuleManagerCallbackCleanupScope)
: javaPart_(jni::make_global(jThis)),
runtimeExecutor_(runtimeExecutor),
jsCallInvoker_(jsCallInvoker),
nativeCallInvoker_(nativeCallInvoker),
delegate_(jni::make_global(delegate)),
turboModuleCache_(std::make_shared<TurboModuleCache>()) {}
turboModuleCache_(std::make_shared<TurboModuleCache>()) {
if (useGlobalCallbackCleanupScopeUsingRetainJSCallback) {
longLivedObjectCollection_ = nullptr;
retainJSCallback_ = [](jsi::Function &&callback,
jsi::Runtime &runtime,
std::shared_ptr<CallInvoker> jsInvoker) {
return CallbackWrapper::createWeak(
std::move(callback), runtime, jsInvoker);
};
} else if (useTurboModuleManagerCallbackCleanupScope) {
longLivedObjectCollection_ = std::make_shared<LongLivedObjectCollection>();
retainJSCallback_ = [longLivedObjectCollection =
longLivedObjectCollection_](
jsi::Function &&callback,
jsi::Runtime &runtime,
std::shared_ptr<CallInvoker> jsInvoker) {
return CallbackWrapper::createWeak(
longLivedObjectCollection, std::move(callback), runtime, jsInvoker);
};
}
}
jni::local_ref<TurboModuleManager::jhybriddata> TurboModuleManager::initHybrid(
jni::alias_ref<jhybridobject> jThis,
jni::alias_ref<JRuntimeExecutor::javaobject> runtimeExecutor,
jni::alias_ref<CallInvokerHolder::javaobject> jsCallInvokerHolder,
jni::alias_ref<CallInvokerHolder::javaobject> nativeCallInvokerHolder,
jni::alias_ref<TurboModuleManagerDelegate::javaobject> delegate) {
jni::alias_ref<TurboModuleManagerDelegate::javaobject> delegate,
bool useGlobalCallbackCleanupScopeUsingRetainJSCallback,
bool useTurboModuleManagerCallbackCleanupScope) {
auto jsCallInvoker = jsCallInvokerHolder->cthis()->getCallInvoker();
auto nativeCallInvoker = nativeCallInvokerHolder->cthis()->getCallInvoker();
@@ -48,7 +72,9 @@ jni::local_ref<TurboModuleManager::jhybriddata> TurboModuleManager::initHybrid(
runtimeExecutor->cthis()->get(),
jsCallInvoker,
nativeCallInvoker,
delegate);
delegate,
useGlobalCallbackCleanupScopeUsingRetainJSCallback,
useTurboModuleManagerCallbackCleanupScope);
}
void TurboModuleManager::registerNatives() {
@@ -70,7 +96,8 @@ void TurboModuleManager::installJSIBindings() {
jsCallInvoker_ = std::weak_ptr<CallInvoker>(jsCallInvoker_),
nativeCallInvoker_ = std::weak_ptr<CallInvoker>(nativeCallInvoker_),
delegate_ = jni::make_weak(delegate_),
javaPart_ = jni::make_weak(javaPart_)](
javaPart_ = jni::make_weak(javaPart_),
retainJSCallback = retainJSCallback_](
const std::string &name) -> std::shared_ptr<TurboModule> {
auto turboModuleCache = turboModuleCache_.lock();
auto jsCallInvoker = jsCallInvoker_.lock();
@@ -131,7 +158,8 @@ void TurboModuleManager::installJSIBindings() {
.moduleName = name,
.instance = moduleInstance,
.jsInvoker = jsCallInvoker,
.nativeInvoker = nativeCallInvoker};
.nativeInvoker = nativeCallInvoker,
.retainJSCallback = retainJSCallback};
auto turboModule = delegate->cthis()->getTurboModule(name, params);
turboModuleCache->insert({name, turboModule});
@@ -142,7 +170,12 @@ void TurboModuleManager::installJSIBindings() {
return nullptr;
};
TurboModuleBinding::install(runtime, std::move(turboModuleProvider));
if (longLivedObjectCollection_) {
TurboModuleBinding::install(
runtime, std::move(turboModuleProvider), longLivedObjectCollection_);
} else {
TurboModuleBinding::install(runtime, std::move(turboModuleProvider));
}
});
}
@@ -9,6 +9,7 @@
#include <ReactCommon/CallInvokerHolder.h>
#include <ReactCommon/JavaTurboModule.h>
#include <ReactCommon/LongLivedObject.h>
#include <ReactCommon/RuntimeExecutor.h>
#include <ReactCommon/TurboModule.h>
#include <ReactCommon/TurboModuleManagerDelegate.h>
@@ -32,7 +33,9 @@ class TurboModuleManager : public jni::HybridClass<TurboModuleManager> {
jni::alias_ref<JRuntimeExecutor::javaobject> runtimeExecutor,
jni::alias_ref<CallInvokerHolder::javaobject> jsCallInvokerHolder,
jni::alias_ref<CallInvokerHolder::javaobject> nativeCallInvokerHolder,
jni::alias_ref<TurboModuleManagerDelegate::javaobject> delegate);
jni::alias_ref<TurboModuleManagerDelegate::javaobject> delegate,
bool useGlobalCallbackCleanupScopeUsingRetainJSCallback,
bool useTurboModuleManagerCallbackCleanupScope);
static void registerNatives();
private:
@@ -43,6 +46,9 @@ class TurboModuleManager : public jni::HybridClass<TurboModuleManager> {
std::shared_ptr<CallInvoker> nativeCallInvoker_;
jni::global_ref<TurboModuleManagerDelegate::javaobject> delegate_;
JSCallbackRetainer retainJSCallback_;
std::shared_ptr<LongLivedObjectCollection> longLivedObjectCollection_;
using TurboModuleCache =
std::unordered_map<std::string, std::shared_ptr<react::TurboModule>>;
@@ -60,7 +66,9 @@ class TurboModuleManager : public jni::HybridClass<TurboModuleManager> {
RuntimeExecutor runtimeExecutor,
std::shared_ptr<CallInvoker> jsCallInvoker,
std::shared_ptr<CallInvoker> nativeCallInvoker,
jni::alias_ref<TurboModuleManagerDelegate::javaobject> delegate);
jni::alias_ref<TurboModuleManagerDelegate::javaobject> delegate,
bool useGlobalCallbackCleanupScopeUsingRetainJSCallback,
bool useTurboModuleManagerCallbackCleanupScope);
};
} // namespace react