From e9246852dffb5e04eab617d2db9103964291208d Mon Sep 17 00:00:00 2001 From: David Vacca Date: Sat, 29 Jul 2023 11:20:24 -0700 Subject: [PATCH] Extract loading of turbomodulejsijni into its own function (#38320) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/38320 In this diff I'm extracting the loading of turbomodulejsijni into its own function. This could have perf implications as we are trying to load multimple times the same soLoader changelog: [intenral] internal Reviewed By: luluwu2032 Differential Revision: D47409162 fbshipit-source-id: 007e89e99ec0e7fa494d811f9c830b1363acec19 --- ...eactPackageTurboModuleManagerDelegate.java | 11 -------- .../core/CallInvokerHolderImpl.java | 16 +++--------- .../NativeMethodCallInvokerHolderImpl.java | 15 +++-------- .../turbomodule/core/NativeModuleSoLoader.kt | 25 +++++++++++++++++++ .../turbomodule/core/TurboModuleManager.java | 15 +++-------- .../core/TurboModuleManagerDelegate.java | 14 +++-------- .../core/TurboModulePerfLogger.java | 15 ++++------- 7 files changed, 45 insertions(+), 66 deletions(-) create mode 100644 packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/NativeModuleSoLoader.kt diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/CompositeReactPackageTurboModuleManagerDelegate.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/CompositeReactPackageTurboModuleManagerDelegate.java index 59ed163e91a..973fdf7cf5b 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/CompositeReactPackageTurboModuleManagerDelegate.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/CompositeReactPackageTurboModuleManagerDelegate.java @@ -12,7 +12,6 @@ import com.facebook.jni.HybridData; import com.facebook.proguard.annotations.DoNotStrip; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.turbomodule.core.TurboModuleManagerDelegate; -import com.facebook.soloader.SoLoader; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -21,8 +20,6 @@ import java.util.List; public class CompositeReactPackageTurboModuleManagerDelegate extends ReactPackageTurboModuleManagerDelegate { - private static volatile boolean sIsSoLibraryLoaded; - protected native HybridData initHybrid(); private CompositeReactPackageTurboModuleManagerDelegate( @@ -53,12 +50,4 @@ public class CompositeReactPackageTurboModuleManagerDelegate return new CompositeReactPackageTurboModuleManagerDelegate(context, packages, delegates); } } - - protected synchronized void maybeLoadOtherSoLibraries() { - // Prevents issues with initializer interruptions. See T38996825 and D13793825 for more context. - if (!sIsSoLibraryLoaded) { - SoLoader.loadLibrary("turbomodulejsijni"); - sIsSoLibraryLoaded = true; - } - } } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/CallInvokerHolderImpl.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/CallInvokerHolderImpl.java index 3f1321a6870..e59bc786e46 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/CallInvokerHolderImpl.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/CallInvokerHolderImpl.java @@ -9,7 +9,6 @@ package com.facebook.react.turbomodule.core; import com.facebook.jni.HybridData; import com.facebook.react.turbomodule.core.interfaces.CallInvokerHolder; -import com.facebook.soloader.SoLoader; /** * JSCallInvoker is created at a different time/place (i.e: in CatalystInstance) than @@ -17,20 +16,13 @@ import com.facebook.soloader.SoLoader; * pass it from CatalystInstance, through Java, to TurboModuleManager::initHybrid. */ public class CallInvokerHolderImpl implements CallInvokerHolder { - private static volatile boolean sIsSoLibraryLoaded; - private final HybridData mHybridData; - private CallInvokerHolderImpl(HybridData hd) { - maybeLoadSoLibrary(); - mHybridData = hd; + static { + NativeModuleSoLoader.maybeLoadSoLibrary(); } - // Prevents issues with initializer interruptions. See T38996825 and D13793825 for more context. - private static synchronized void maybeLoadSoLibrary() { - if (!sIsSoLibraryLoaded) { - SoLoader.loadLibrary("turbomodulejsijni"); - sIsSoLibraryLoaded = true; - } + private CallInvokerHolderImpl(HybridData hd) { + mHybridData = hd; } } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/NativeMethodCallInvokerHolderImpl.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/NativeMethodCallInvokerHolderImpl.java index 79b2bea4707..1f7012bdfb7 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/NativeMethodCallInvokerHolderImpl.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/NativeMethodCallInvokerHolderImpl.java @@ -9,7 +9,6 @@ package com.facebook.react.turbomodule.core; import com.facebook.jni.HybridData; import com.facebook.react.turbomodule.core.interfaces.NativeMethodCallInvokerHolder; -import com.facebook.soloader.SoLoader; /** * NativeMethodCallInvokerHolder is created at a different time/place (i.e: in CatalystInstance) @@ -18,20 +17,14 @@ import com.facebook.soloader.SoLoader; * TurboModuleManager::initHybrid. */ public class NativeMethodCallInvokerHolderImpl implements NativeMethodCallInvokerHolder { - private static volatile boolean sIsSoLibraryLoaded; private final HybridData mHybridData; - private NativeMethodCallInvokerHolderImpl(HybridData hd) { - maybeLoadSoLibrary(); - mHybridData = hd; + static { + NativeModuleSoLoader.maybeLoadSoLibrary(); } - // Prevents issues with initializer interruptions. See T38996825 and D13793825 for more context. - private static synchronized void maybeLoadSoLibrary() { - if (!sIsSoLibraryLoaded) { - SoLoader.loadLibrary("turbomodulejsijni"); - sIsSoLibraryLoaded = true; - } + private NativeMethodCallInvokerHolderImpl(HybridData hd) { + mHybridData = hd; } } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/NativeModuleSoLoader.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/NativeModuleSoLoader.kt new file mode 100644 index 00000000000..0c2221d13fa --- /dev/null +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/NativeModuleSoLoader.kt @@ -0,0 +1,25 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.react.turbomodule.core + +import com.facebook.soloader.SoLoader + +internal class NativeModuleSoLoader { + companion object { + private var isSoLibraryLoaded = false + + @Synchronized + @JvmStatic + fun maybeLoadSoLibrary() { + if (!isSoLibraryLoaded) { + SoLoader.loadLibrary("turbomodulejsijni") + isSoLibraryLoaded = true + } + } + } +} diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/TurboModuleManager.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/TurboModuleManager.java index aa29e666d26..1a3d3a9a0f6 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/TurboModuleManager.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/TurboModuleManager.java @@ -25,7 +25,6 @@ import com.facebook.react.turbomodule.core.interfaces.CallInvokerHolder; import com.facebook.react.turbomodule.core.interfaces.NativeMethodCallInvokerHolder; import com.facebook.react.turbomodule.core.interfaces.TurboModule; import com.facebook.react.turbomodule.core.interfaces.TurboModuleRegistry; -import com.facebook.soloader.SoLoader; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -38,12 +37,15 @@ import java.util.Map; * a Java module, that the C++ counterpart calls. */ public class TurboModuleManager implements JSIModule, TurboModuleRegistry { - private static volatile boolean sIsSoLibraryLoaded; private final List mEagerInitModuleNames; private final ModuleProvider mTurboModuleProvider; private final ModuleProvider mLegacyModuleProvider; private final TurboModuleManagerDelegate mDelegate; + static { + NativeModuleSoLoader.maybeLoadSoLibrary(); + } + // Prevents the creation of new TurboModules once cleanup as been initiated. private final Object mModuleCleanupLock = new Object(); @@ -63,7 +65,6 @@ public class TurboModuleManager implements JSIModule, TurboModuleRegistry { @Nullable final TurboModuleManagerDelegate delegate, CallInvokerHolder jsCallInvokerHolder, NativeMethodCallInvokerHolder nativeMethodCallInvokerHolder) { - maybeLoadSoLibrary(); mDelegate = delegate; mHybridData = initHybrid( @@ -451,14 +452,6 @@ public class TurboModuleManager implements JSIModule, TurboModuleRegistry { mHybridData.resetNative(); } - // Prevents issues with initializer interruptions. See T38996825 and D13793825 for more context. - private static synchronized void maybeLoadSoLibrary() { - if (!sIsSoLibraryLoaded) { - SoLoader.loadLibrary("turbomodulejsijni"); - sIsSoLibraryLoaded = true; - } - } - private static class ModuleHolder { private volatile NativeModule mModule = null; private volatile boolean mIsTryingToCreate = false; diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/TurboModuleManagerDelegate.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/TurboModuleManagerDelegate.java index 4c187079eb3..5e83bb5d8e6 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/TurboModuleManagerDelegate.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/TurboModuleManagerDelegate.java @@ -12,7 +12,6 @@ import com.facebook.jni.HybridData; import com.facebook.proguard.annotations.DoNotStrip; import com.facebook.react.bridge.NativeModule; import com.facebook.react.turbomodule.core.interfaces.TurboModule; -import com.facebook.soloader.SoLoader; import java.util.ArrayList; import java.util.List; @@ -21,13 +20,14 @@ public abstract class TurboModuleManagerDelegate { @SuppressWarnings("unused") private final HybridData mHybridData; - private static volatile boolean sIsSoLibraryLoaded; + static { + NativeModuleSoLoader.maybeLoadSoLibrary(); + } protected abstract HybridData initHybrid(); protected TurboModuleManagerDelegate() { maybeLoadOtherSoLibraries(); - maybeLoadSoLibrary(); mHybridData = initHybrid(); } @@ -57,13 +57,5 @@ public abstract class TurboModuleManagerDelegate { return new ArrayList<>(); } - // Prevents issues with initializer interruptions. See T38996825 and D13793825 for more context. - private static synchronized void maybeLoadSoLibrary() { - if (!sIsSoLibraryLoaded) { - SoLoader.loadLibrary("turbomodulejsijni"); - sIsSoLibraryLoaded = true; - } - } - protected synchronized void maybeLoadOtherSoLibraries() {} } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/TurboModulePerfLogger.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/TurboModulePerfLogger.java index 5bb2a8ca9f7..b845b0c9cd5 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/TurboModulePerfLogger.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/TurboModulePerfLogger.java @@ -9,13 +9,16 @@ package com.facebook.react.turbomodule.core; import com.facebook.proguard.annotations.DoNotStrip; import com.facebook.react.perflogger.NativeModulePerfLogger; -import com.facebook.soloader.SoLoader; import javax.annotation.Nullable; @DoNotStrip public class TurboModulePerfLogger { + @Nullable private static NativeModulePerfLogger sNativeModulePerfLogger = null; - private static boolean sIsSoLibraryLoaded = false; + + static { + NativeModuleSoLoader.maybeLoadSoLibrary(); + } public static void moduleDataCreateStart(String moduleName, int id) { if (sNativeModulePerfLogger != null) { @@ -79,17 +82,9 @@ public class TurboModulePerfLogger { private static native void jniEnableCppLogging(NativeModulePerfLogger perfLogger); - private static synchronized void maybeLoadSoLibrary() { - if (!sIsSoLibraryLoaded) { - SoLoader.loadLibrary("turbomodulejsijni"); - sIsSoLibraryLoaded = true; - } - } - public static void enableLogging(NativeModulePerfLogger perfLogger) { if (perfLogger != null) { sNativeModulePerfLogger = perfLogger; - maybeLoadSoLibrary(); jniEnableCppLogging(perfLogger); } }