From 5d682d65f6d1719e45eb94a9a6fd7cb0569ac5c3 Mon Sep 17 00:00:00 2001 From: Mike Armstrong Date: Tue, 6 Oct 2015 09:09:19 -0700 Subject: [PATCH] set JS profiling global to true, fix to parsing of strings with ascii value >=128 Reviewed By: @mkonicek Differential Revision: D2512320 fb-gh-sync-id: 098727cd664f0f0cdb0092875a9934a5d7b577f2 --- .../react/bridge/CatalystInstance.java | 45 +++++++++++++++++++ .../facebook/react/bridge/ReactBridge.java | 4 ++ 2 files changed, 49 insertions(+) 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 4621914f09..75cfb05883 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstance.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstance.java @@ -28,6 +28,7 @@ import com.facebook.react.common.ReactConstants; import com.facebook.react.common.annotations.VisibleForTesting; import com.facebook.infer.annotation.Assertions; import com.facebook.systrace.Systrace; +import com.facebook.systrace.TraceListener; import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonGenerator; @@ -60,6 +61,7 @@ public class CatalystInstance { // Access from JS thread private @Nullable ReactBridge mBridge; private @Nullable JavaScriptModuleRegistry mJSModuleRegistry; + private @Nullable TraceListener mTraceListener; private CatalystInstance( final CatalystQueueConfigurationSpec catalystQueueConfigurationSpec, @@ -119,6 +121,45 @@ public class CatalystInstance { } finally { Systrace.endSection(Systrace.TRACE_TAG_REACT_JAVA_BRIDGE); } + + mTraceListener = new TraceListener() { + @Override + public void onTraceStarted() { + mCatalystQueueConfiguration.getJSQueueThread().runOnQueue( + new Runnable() { + @Override + public void run() { + mCatalystQueueConfiguration.getJSQueueThread().assertIsOnThread(); + + if (mDestroyed) { + return; + } + Assertions.assertNotNull(mBridge).setGlobalVariable( + "__BridgeProfilingIsProfiling", + "true"); + } + }); + } + + @Override + public void onTraceStopped() { + mCatalystQueueConfiguration.getJSQueueThread().runOnQueue( + new Runnable() { + @Override + public void run() { + mCatalystQueueConfiguration.getJSQueueThread().assertIsOnThread(); + + if (mDestroyed) { + return; + } + Assertions.assertNotNull(mBridge).setGlobalVariable( + "__BridgeProfilingIsProfiling", + "false"); + } + }); + } + }; + Systrace.registerListener(mTraceListener); } /* package */ void callFunction( @@ -207,6 +248,10 @@ public class CatalystInstance { } } + if (mTraceListener != null) { + Systrace.unregisterListener(mTraceListener); + } + // We can access the Bridge from any thread now because we know either we are on the JS thread // or the JS thread has finished via CatalystQueueConfiguration#destroy() Assertions.assertNotNull(mBridge).dispose(); diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactBridge.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactBridge.java index 137ca098ec..624de7506f 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactBridge.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactBridge.java @@ -60,6 +60,10 @@ public class ReactBridge extends Countable { JavaScriptExecutor jsExecutor, ReactCallback callback, MessageQueueThread nativeModulesQueueThread); + + /** + * All native functions are not thread safe and appropriate queues should be used + */ public native void loadScriptFromAssets(AssetManager assetManager, String assetName); public native void loadScriptFromNetworkCached(String sourceURL, @Nullable String tempFileName); public native void callFunction(int moduleId, int methodId, NativeArray arguments);