From f0d98104ae4c220fe67d84276d5df00503e4d7fc Mon Sep 17 00:00:00 2001 From: Kathy Gray Date: Tue, 22 Aug 2017 03:28:36 -0700 Subject: [PATCH] Reduce possible race condition on gc of catalyst instance Reviewed By: cwdick Differential Revision: D5669579 fbshipit-source-id: 165e19b68199e89bb99f7f93f2b1ec70729b2848 --- .../java/com/facebook/react/bridge/CatalystInstanceImpl.java | 3 +++ ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp | 4 ++++ ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.h | 2 ++ 3 files changed, 9 insertions(+) diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java index c372d16e3d..adf9a39872 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java @@ -329,6 +329,7 @@ public class CatalystInstanceImpl implements CatalystInstance { UiThreadUtil.runOnUiThread(new Runnable() { @Override public void run() { + quitQueuesSynchronous(); mHybridData.resetNative(); // Kill non-UI threads from UI thread. getReactQueueConfiguration().destroy(); @@ -342,6 +343,8 @@ public class CatalystInstanceImpl implements CatalystInstance { Systrace.unregisterListener(mTraceListener); } + private native void quitQueuesSynchronous(); + @Override public boolean isDestroyed() { return mDestroyed; diff --git a/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp b/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp index 30c2595af3..7991531b08 100644 --- a/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp +++ b/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp @@ -85,6 +85,9 @@ CatalystInstanceImpl::CatalystInstanceImpl() : instance_(folly::make_unique()) {} CatalystInstanceImpl::~CatalystInstanceImpl() { +} + +void CatalystInstanceImpl::quitQueuesSynchronous() { moduleMessageQueue_->quitSynchronous(); if (uiBackgroundMessageQueue_ != NULL) { uiBackgroundMessageQueue_->quitSynchronous(); @@ -95,6 +98,7 @@ void CatalystInstanceImpl::registerNatives() { registerHybrid({ makeNativeMethod("initHybrid", CatalystInstanceImpl::initHybrid), makeNativeMethod("initializeBridge", CatalystInstanceImpl::initializeBridge), + makeNativeMethod("quitQueuesSynchronous", CatalystInstanceImpl::quitQueuesSynchronous), makeNativeMethod("jniExtendNativeModules", CatalystInstanceImpl::extendNativeModules), makeNativeMethod("jniSetSourceURL", CatalystInstanceImpl::jniSetSourceURL), makeNativeMethod("jniLoadScriptFromAssets", CatalystInstanceImpl::jniLoadScriptFromAssets), diff --git a/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.h b/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.h index 63034daa40..07596c50f9 100644 --- a/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.h +++ b/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.h @@ -35,6 +35,8 @@ class CatalystInstanceImpl : public jni::HybridClass { return instance_; } + void quitQueuesSynchronous(); + private: friend HybridBase;