mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
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:
committed by
Facebook GitHub Bot
parent
32bfd7a857
commit
034c6dfe34
@@ -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;
|
||||
|
||||
|
||||
+7
-2
@@ -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();
|
||||
|
||||
|
||||
+40
-7
@@ -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));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
+10
-2
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user