diff --git a/ReactAndroid/src/main/java/com/facebook/react/MemoryPressureRouter.java b/ReactAndroid/src/main/java/com/facebook/react/MemoryPressureRouter.java index 7a17830a8..940d9f101 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/MemoryPressureRouter.java +++ b/ReactAndroid/src/main/java/com/facebook/react/MemoryPressureRouter.java @@ -25,32 +25,18 @@ import static android.content.ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN; /** * Translates and routes memory pressure events to the current catalyst instance. */ -public class MemoryPressureRouter { +public class MemoryPressureRouter implements ComponentCallbacks2 { // Trigger this by sending an intent to your activity with adb shell: - // am broadcast -a com.facebook.catalyst.ACTION_TRIM_MEMORY_MODERATE + // am broadcast -a com.facebook.react.ACTION_TRIM_MEMORY_MODERATE private static final String ACTION_TRIM_MEMORY_UI_HIDDEN = - "com.facebook.rnfeed.ACTION_TRIM_MEMORY_UI_HIDDEN"; + "com.facebook.react.ACTION_TRIM_MEMORY_UI_HIDDEN"; private static final String ACTION_TRIM_MEMORY_MODERATE = - "com.facebook.rnfeed.ACTION_TRIM_MEMORY_MODERATE"; + "com.facebook.react.ACTION_TRIM_MEMORY_MODERATE"; private static final String ACTION_TRIM_MEMORY_CRITICAL = - "com.facebook.rnfeed.ACTION_TRIM_MEMORY_CRITICAL"; + "com.facebook.react.ACTION_TRIM_MEMORY_CRITICAL"; private final Set mListeners = Collections.synchronizedSet(new LinkedHashSet()); - private final ComponentCallbacks2 mCallbacks = new ComponentCallbacks2() { - @Override - public void onTrimMemory(int level) { - trimMemory(level); - } - - @Override - public void onConfigurationChanged(Configuration newConfig) { - } - - @Override - public void onLowMemory() { - } - }; @TargetApi(Build.VERSION_CODES.JELLY_BEAN) public static boolean handleDebugIntent(Application application, String action) { @@ -71,7 +57,11 @@ public class MemoryPressureRouter { } MemoryPressureRouter(Context context) { - context.getApplicationContext().registerComponentCallbacks(mCallbacks); + context.getApplicationContext().registerComponentCallbacks(this); + } + + public void destroy(Context context) { + context.getApplicationContext().unregisterComponentCallbacks(this); } /** @@ -88,11 +78,8 @@ public class MemoryPressureRouter { mListeners.remove(listener); } - public void destroy(Context context) { - context.getApplicationContext().unregisterComponentCallbacks(mCallbacks); - } - - private void trimMemory(int level) { + @Override + public void onTrimMemory(int level) { if (level >= TRIM_MEMORY_COMPLETE) { dispatchMemoryPressure(MemoryPressure.CRITICAL); } else if (level >= TRIM_MEMORY_BACKGROUND || level == TRIM_MEMORY_RUNNING_CRITICAL) { @@ -102,6 +89,14 @@ public class MemoryPressureRouter { } } + @Override + public void onConfigurationChanged(Configuration newConfig) { + } + + @Override + public void onLowMemory() { + } + private void dispatchMemoryPressure(MemoryPressure level) { // copy listeners array to avoid ConcurrentModificationException if any of the listeners remove // themselves in handleMemoryPressure() 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 f57ef2e30..ca7ab2427 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java @@ -393,26 +393,14 @@ public class CatalystInstanceImpl implements CatalystInstance { return mNativeModuleRegistry.getAllModules(); } - private native void handleMemoryPressureUiHidden(); - private native void handleMemoryPressureModerate(); - private native void handleMemoryPressureCritical(); + private native void jniHandleMemoryPressure(int level); @Override public void handleMemoryPressure(MemoryPressure level) { if (mDestroyed) { return; } - switch (level) { - case UI_HIDDEN: - handleMemoryPressureUiHidden(); - break; - case MODERATE: - handleMemoryPressureModerate(); - break; - case CRITICAL: - handleMemoryPressureCritical(); - break; - } + jniHandleMemoryPressure(level.ordinal()); } /** diff --git a/ReactAndroid/src/main/jni/react/jni/BUCK b/ReactAndroid/src/main/jni/react/jni/BUCK index ea4b48977..6cbe74c25 100644 --- a/ReactAndroid/src/main/jni/react/jni/BUCK +++ b/ReactAndroid/src/main/jni/react/jni/BUCK @@ -40,6 +40,7 @@ cxx_library( "-DLOG_TAG=\"ReactNativeJNI\"", "-DWITH_FBSYSTRACE=1", "-DWITH_INSPECTOR=1", + "-DWITH_JSC_MEMORY_PRESSURE=1", ], soname = "libreactnativejni.$(ext)", visibility = [ diff --git a/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp b/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp index 994975f2d..bb755d7f6 100644 --- a/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp +++ b/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp @@ -103,9 +103,7 @@ void CatalystInstanceImpl::registerNatives() { makeNativeMethod("jniCallJSCallback", CatalystInstanceImpl::jniCallJSCallback), makeNativeMethod("setGlobalVariable", CatalystInstanceImpl::setGlobalVariable), makeNativeMethod("getJavaScriptContext", CatalystInstanceImpl::getJavaScriptContext), - makeNativeMethod("handleMemoryPressureUiHidden", CatalystInstanceImpl::handleMemoryPressureUiHidden), - makeNativeMethod("handleMemoryPressureModerate", CatalystInstanceImpl::handleMemoryPressureModerate), - makeNativeMethod("handleMemoryPressureCritical", CatalystInstanceImpl::handleMemoryPressureCritical), + makeNativeMethod("jniHandleMemoryPressure", CatalystInstanceImpl::handleMemoryPressure), makeNativeMethod("supportsProfiling", CatalystInstanceImpl::supportsProfiling), makeNativeMethod("startProfiler", CatalystInstanceImpl::startProfiler), makeNativeMethod("stopProfiler", CatalystInstanceImpl::stopProfiler), @@ -262,16 +260,10 @@ jlong CatalystInstanceImpl::getJavaScriptContext() { return (jlong) (intptr_t) instance_->getJavaScriptContext(); } -void CatalystInstanceImpl::handleMemoryPressureUiHidden() { - instance_->handleMemoryPressureUiHidden(); -} - -void CatalystInstanceImpl::handleMemoryPressureModerate() { - instance_->handleMemoryPressureModerate(); -} - -void CatalystInstanceImpl::handleMemoryPressureCritical() { - instance_->handleMemoryPressureCritical(); +void CatalystInstanceImpl::handleMemoryPressure(int pressureLevel) { + #ifdef WITH_JSC_MEMORY_PRESSURE + instance_->handleMemoryPressure(pressureLevel); + #endif } jboolean CatalystInstanceImpl::supportsProfiling() { diff --git a/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.h b/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.h index f4aefb01c..b4f67ef8c 100644 --- a/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.h +++ b/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.h @@ -68,9 +68,7 @@ class CatalystInstanceImpl : public jni::HybridClass { void setGlobalVariable(std::string propName, std::string&& jsonValue); jlong getJavaScriptContext(); - void handleMemoryPressureUiHidden(); - void handleMemoryPressureModerate(); - void handleMemoryPressureCritical(); + void handleMemoryPressure(int pressureLevel); jboolean supportsProfiling(); void startProfiler(const std::string& title); void stopProfiler(const std::string& title, const std::string& filename); diff --git a/ReactCommon/cxxreact/Instance.cpp b/ReactCommon/cxxreact/Instance.cpp index 6db8f3003..322296e90 100644 --- a/ReactCommon/cxxreact/Instance.cpp +++ b/ReactCommon/cxxreact/Instance.cpp @@ -134,17 +134,11 @@ void Instance::callJSCallback(uint64_t callbackId, folly::dynamic&& params) { nativeToJsBridge_->invokeCallback((double) callbackId, std::move(params)); } -void Instance::handleMemoryPressureUiHidden() { - nativeToJsBridge_->handleMemoryPressureUiHidden(); -} - -void Instance::handleMemoryPressureModerate() { - nativeToJsBridge_->handleMemoryPressureModerate(); -} - -void Instance::handleMemoryPressureCritical() { - nativeToJsBridge_->handleMemoryPressureCritical(); +#ifdef WITH_JSC_MEMORY_PRESSURE +void Instance::handleMemoryPressure(int pressureLevel) { + nativeToJsBridge_->handleMemoryPressure(pressureLevel); } +#endif } // namespace react } // namespace facebook diff --git a/ReactCommon/cxxreact/Instance.h b/ReactCommon/cxxreact/Instance.h index 6424958b6..dc5bfd2d4 100644 --- a/ReactCommon/cxxreact/Instance.h +++ b/ReactCommon/cxxreact/Instance.h @@ -63,9 +63,9 @@ class Instance { return nativeToJsBridge_->callFunctionSync(module, method, std::forward(args)); } - void handleMemoryPressureUiHidden(); - void handleMemoryPressureModerate(); - void handleMemoryPressureCritical(); + #ifdef WITH_JSC_MEMORY_PRESSURE + void handleMemoryPressure(int pressureLevel); + #endif private: void callNativeModules(folly::dynamic&& calls, bool isEndOfBatch); diff --git a/ReactCommon/cxxreact/JSCExecutor.cpp b/ReactCommon/cxxreact/JSCExecutor.cpp index bb10718df..c65c4f7f8 100644 --- a/ReactCommon/cxxreact/JSCExecutor.cpp +++ b/ReactCommon/cxxreact/JSCExecutor.cpp @@ -579,23 +579,11 @@ void JSCExecutor::stopProfiler(const std::string &titleString, const std::string #endif } -void JSCExecutor::handleMemoryPressureUiHidden() { - #ifdef WITH_JSC_MEMORY_PRESSURE - JSHandleMemoryPressure(this, m_context, JSMemoryPressure::UI_HIDDEN); - #endif -} - -void JSCExecutor::handleMemoryPressureModerate() { - #ifdef WITH_JSC_MEMORY_PRESSURE - JSHandleMemoryPressure(this, m_context, JSMemoryPressure::MODERATE); - #endif -} - -void JSCExecutor::handleMemoryPressureCritical() { - #ifdef WITH_JSC_MEMORY_PRESSURE - JSHandleMemoryPressure(this, m_context, JSMemoryPressure::CRITICAL); - #endif +#ifdef WITH_JSC_MEMORY_PRESSURE +void JSCExecutor::handleMemoryPressure(int pressureLevel) { + JSHandleMemoryPressure(this, m_context, static_cast(pressureLevel)); } +#endif void JSCExecutor::flushQueueImmediate(Value&& queue) { auto queueStr = queue.toJSONString(); diff --git a/ReactCommon/cxxreact/JSCExecutor.h b/ReactCommon/cxxreact/JSCExecutor.h index 9b6834c66..0d2100275 100644 --- a/ReactCommon/cxxreact/JSCExecutor.h +++ b/ReactCommon/cxxreact/JSCExecutor.h @@ -83,9 +83,9 @@ public: virtual void startProfiler(const std::string &titleString) override; virtual void stopProfiler(const std::string &titleString, const std::string &filename) override; - virtual void handleMemoryPressureUiHidden() override; - virtual void handleMemoryPressureModerate() override; - virtual void handleMemoryPressureCritical() override; +#ifdef WITH_JSC_MEMORY_PRESSURE + virtual void handleMemoryPressure(int pressureLevel) override; +#endif virtual void destroy() override; diff --git a/ReactCommon/cxxreact/JSExecutor.h b/ReactCommon/cxxreact/JSExecutor.h index fc42b8edb..80a1d89a1 100644 --- a/ReactCommon/cxxreact/JSExecutor.h +++ b/ReactCommon/cxxreact/JSExecutor.h @@ -77,11 +77,11 @@ public: } virtual void startProfiler(const std::string &titleString) {} virtual void stopProfiler(const std::string &titleString, const std::string &filename) {} - virtual void handleMemoryPressureUiHidden() {} - virtual void handleMemoryPressureModerate() {} - virtual void handleMemoryPressureCritical() { - handleMemoryPressureModerate(); - } + + #ifdef WITH_JSC_MEMORY_PRESSURE + virtual void handleMemoryPressure(int pressureLevel) {} + #endif + virtual void destroy() {} virtual ~JSExecutor() {} }; diff --git a/ReactCommon/cxxreact/NativeToJsBridge.cpp b/ReactCommon/cxxreact/NativeToJsBridge.cpp index 5039b699c..49ac8b0a5 100644 --- a/ReactCommon/cxxreact/NativeToJsBridge.cpp +++ b/ReactCommon/cxxreact/NativeToJsBridge.cpp @@ -201,23 +201,13 @@ void NativeToJsBridge::stopProfiler(const std::string& title, const std::string& }); } -void NativeToJsBridge::handleMemoryPressureUiHidden() { +#ifdef WITH_JSC_MEMORY_PRESSURE +void NativeToJsBridge::handleMemoryPressure(int pressureLevel) { runOnExecutorQueue([=] (JSExecutor* executor) { - executor->handleMemoryPressureUiHidden(); - }); -} - -void NativeToJsBridge::handleMemoryPressureModerate() { - runOnExecutorQueue([=] (JSExecutor* executor) { - executor->handleMemoryPressureModerate(); - }); -} - -void NativeToJsBridge::handleMemoryPressureCritical() { - runOnExecutorQueue([=] (JSExecutor* executor) { - executor->handleMemoryPressureCritical(); + executor->handleMemoryPressure(pressureLevel); }); } +#endif void NativeToJsBridge::destroy() { // All calls made through runOnExecutorQueue have an early exit if diff --git a/ReactCommon/cxxreact/NativeToJsBridge.h b/ReactCommon/cxxreact/NativeToJsBridge.h index 227cd5e5b..ba6284d86 100644 --- a/ReactCommon/cxxreact/NativeToJsBridge.h +++ b/ReactCommon/cxxreact/NativeToJsBridge.h @@ -103,9 +103,10 @@ public: bool supportsProfiling(); void startProfiler(const std::string& title); void stopProfiler(const std::string& title, const std::string& filename); - void handleMemoryPressureUiHidden(); - void handleMemoryPressureModerate(); - void handleMemoryPressureCritical(); + + #ifdef WITH_JSC_MEMORY_PRESSURE + void handleMemoryPressure(int pressureLevel); + #endif /** * Synchronously tears down the bridge and the main executor.