From 6a45f058729334145e2da2236982536b901ed4aa Mon Sep 17 00:00:00 2001 From: Andy Street Date: Wed, 2 Nov 2016 07:47:29 -0700 Subject: [PATCH] Use whether react instance is accepting calls to determine whether instance is active Summary: There was previously a race condition where hasActiveCatalystInstance would return true, but calling a JS module call on it would result in a crash. Now, hasActivtyCatalystInstance will only return true once the instance is actually accepting calls. I'll follow this up with a more risky diff that gets rid of hasActiveCatalystInstance and just queues JS calls until runJSBundle is called. Reviewed By: javache Differential Revision: D4117374 fbshipit-source-id: 60941f68b0906a8213571305c564bfe3d053f51b --- .../java/com/facebook/react/bridge/CatalystInstance.java | 1 + .../main/java/com/facebook/react/bridge/ReactContext.java | 2 +- .../facebook/react/cxxbridge/CatalystInstanceImpl.java | 8 +++++--- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstance.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstance.java index a6ab8fd65..fbf8925cb 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstance.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstance.java @@ -40,6 +40,7 @@ public interface CatalystInstance extends MemoryPressureListener { */ void destroy(); boolean isDestroyed(); + boolean isAcceptingCalls(); /** * Initialize all the native modules diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactContext.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactContext.java index 674655b99..35ec76084 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactContext.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactContext.java @@ -143,7 +143,7 @@ public class ReactContext extends ContextWrapper { } public boolean hasActiveCatalystInstance() { - return mCatalystInstance != null && !mCatalystInstance.isDestroyed(); + return mCatalystInstance != null && mCatalystInstance.isAcceptingCalls(); } public LifecycleState getLifecycleState() { diff --git a/ReactAndroid/src/main/java/com/facebook/react/cxxbridge/CatalystInstanceImpl.java b/ReactAndroid/src/main/java/com/facebook/react/cxxbridge/CatalystInstanceImpl.java index 3fe348bc5..fad0ff908 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/cxxbridge/CatalystInstanceImpl.java +++ b/ReactAndroid/src/main/java/com/facebook/react/cxxbridge/CatalystInstanceImpl.java @@ -55,9 +55,6 @@ public class CatalystInstanceImpl implements CatalystInstance { SoLoader.loadLibrary(REACT_NATIVE_LIB); } - private static final int BRIDGE_SETUP_TIMEOUT_MS = 30000; - private static final int LOAD_JS_BUNDLE_TIMEOUT_MS = 30000; - private static final AtomicInteger sNextInstanceIdForTrace = new AtomicInteger(1); // Access from any thread @@ -247,6 +244,11 @@ public class CatalystInstanceImpl implements CatalystInstance { return mDestroyed; } + @Override + public boolean isAcceptingCalls() { + return !mDestroyed && mAcceptCalls; + } + /** * Initialize all the native modules */