From 27cf82074daa8f1f8e0584cc0492dddeaf7b85aa Mon Sep 17 00:00:00 2001 From: Ramanpreet Nara Date: Tue, 17 Nov 2020 00:32:01 -0800 Subject: [PATCH] Guard against initializer interruptions in {Catalyst,Work,RNTester}TurboModuleManagerDelegate Summary: Migrate over to [how we load so libraries in Fb4aTurboModuleManagerDelegate](https://fburl.com/diffusion/wu0mcr8o). ## Motivation When we migrated Twilight over to TurboModules, we used the CatalystTurboModuleManager as a template. This led to a production crash (T70918829) because we weren't loading so's this way. The fix: D24894071. I'm updating these two TMMDelegates so that people don't fall into the same trap when migrating other Standalone apps. Changelog: [Internal] Reviewed By: fkgozali Differential Revision: D24992931 fbshipit-source-id: 3ac3b8c30a67e24f79021f915abf5ae980d5b5d3 --- .../RNTesterTurboModuleManagerDelegate.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterTurboModuleManagerDelegate.java b/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterTurboModuleManagerDelegate.java index 0baf04bc1d7..95c2b6b93fc 100644 --- a/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterTurboModuleManagerDelegate.java +++ b/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterTurboModuleManagerDelegate.java @@ -17,9 +17,7 @@ import java.util.List; /** This class is responsible for creating all the TurboModules for the RNTester app. */ public class RNTesterTurboModuleManagerDelegate extends ReactPackageTurboModuleManagerDelegate { - static { - SoLoader.loadLibrary("rntester_appmodules"); - } + private static volatile boolean sIsSoLibraryLoaded; protected native HybridData initHybrid(); @@ -30,4 +28,17 @@ public class RNTesterTurboModuleManagerDelegate extends ReactPackageTurboModuleM ReactApplicationContext context, List packages) { super(context, packages); } + + @Override + protected void maybeLoadOtherSoLibraries() { + maybeLoadSoLibraries(); + } + + // Prevents issues with initializer interruptions. + private static synchronized void maybeLoadSoLibraries() { + if (!sIsSoLibraryLoaded) { + SoLoader.loadLibrary("rntester_appmodules"); + sIsSoLibraryLoaded = true; + } + } }