summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjdduke <jdduke@chromium.org>2014-11-13 09:32:01 -0800
committerBo Liu <boliu@google.com>2014-11-13 15:33:50 -0800
commit7a4903d2d8aef7ca5e09f0f5ceed845ce4625934 (patch)
tree14cd3f548fbb0efb11624a21ffdd27bb1c5a3102
parent3eaa0a6864d789c352be4a8216f2797a475e01e0 (diff)
downloadchromium_org-7a4903d2d8aef7ca5e09f0f5ceed845ce4625934.tar.gz
Cherry-pick: Revert of [Android] Experimental sync barrier detection for tracing (patchset #6 id:100001 of https://codereview.chromium.org/575103002/)
Cherry-pick of chromium crrev.com/adefc40cb9652a2ea046bbdbef223d881f4a7463 Conflicts: base/android/java/src/org/chromium/base/SystemMessageHandler.java BUG: 18283959 Original description: Reason for revert: Barrier detection is no longer necessary, see crrev.com/512333002. Original issue's description: > [Android] Experimental sync barrier detection for tracing > > When an Android View is invalidated outside of frame dispatch > (animation/input/draw), a sync barrier may be inserted into the shared > UI thread message loop. This effectively blocks dispatch of all Chrome > tasks posted to the browser UI thread for an entire frame (or more if > the View is continually invalidated). > > There are currently no easy or even automated ways to avoid this > untimely invalidation, and judicious coding can only take us so far. As > an intermediate assist in debugging the issue, use reflection and a > crude form of MessageQueue inspection to trace known cases where the > MessageQueue is blocked by a sync barrier. > > Note that this detection is not perfect, neither is it exact, but it's a > solid proxy for informing traces about such pipeline stalls. > > BUG=407133 > > Committed: https://crrev.com/85bceaa6e05ee1bf42ac220ddcbb50ca268c1ea4 > Cr-Commit-Position: refs/heads/master@{#296249} Change-Id: Ie92ab895b864bf466ac092a1a1b7fdc80a8fd3ce
-rw-r--r--base/android/java/src/org/chromium/base/SystemMessageHandler.java107
1 files changed, 1 insertions, 106 deletions
diff --git a/base/android/java/src/org/chromium/base/SystemMessageHandler.java b/base/android/java/src/org/chromium/base/SystemMessageHandler.java
index 42c8987ec6..e1fbb0f4be 100644
--- a/base/android/java/src/org/chromium/base/SystemMessageHandler.java
+++ b/base/android/java/src/org/chromium/base/SystemMessageHandler.java
@@ -5,19 +5,10 @@
package org.chromium.base;
import android.os.Handler;
-import android.os.Looper;
import android.os.Message;
-import android.os.MessageQueue;
-import android.util.Log;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
class SystemMessageHandler extends Handler {
- private static final String TAG = "SystemMessageHandler";
-
private static final int SCHEDULED_WORK = 1;
private static final int DELAYED_SCHEDULED_WORK = 2;
@@ -25,23 +16,12 @@ class SystemMessageHandler extends Handler {
private long mMessagePumpDelegateNative = 0;
private long mDelayedScheduledTimeTicks = 0;
- // The following members are used to detect and trace the presence of sync
- // barriers in Android's MessageQueue. Note that this detection is
- // experimental, temporary and intended only for diagnostic purposes.
- private MessageQueue mMessageQueue;
- private Field mMessageQueueMessageField;
- private Field mMessageTargetField;
- private boolean mQueueHasSyncBarrier;
- private long mSyncBarrierTraceId;
-
private SystemMessageHandler(long messagePumpDelegateNative) {
mMessagePumpDelegateNative = messagePumpDelegateNative;
- tryEnableSyncBarrierDetection();
- }
+ }
@Override
public void handleMessage(Message msg) {
- updateWhetherQueueHasBlockingSyncBarrier();
if (msg.what == DELAYED_SCHEDULED_WORK) {
mDelayedScheduledTimeTicks = 0;
}
@@ -51,8 +31,6 @@ class SystemMessageHandler extends Handler {
@SuppressWarnings("unused")
@CalledByNative
private void scheduleWork() {
- updateWhetherQueueHasBlockingSyncBarrier();
- if (mQueueHasSyncBarrier) TraceEvent.instant("SystemMessageHandler:immediateWorkBlocked");
sendEmptyMessage(SCHEDULED_WORK);
}
@@ -63,99 +41,16 @@ class SystemMessageHandler extends Handler {
removeMessages(DELAYED_SCHEDULED_WORK);
}
mDelayedScheduledTimeTicks = delayedTimeTicks;
- updateWhetherQueueHasBlockingSyncBarrier();
- if (mQueueHasSyncBarrier) TraceEvent.instant("SystemMessageHandler:delayedWorkBlocked");
sendEmptyMessageDelayed(DELAYED_SCHEDULED_WORK, millis);
}
@SuppressWarnings("unused")
@CalledByNative
private void removeAllPendingMessages() {
- updateWhetherQueueHasBlockingSyncBarrier();
removeMessages(SCHEDULED_WORK);
removeMessages(DELAYED_SCHEDULED_WORK);
}
- private void updateWhetherQueueHasBlockingSyncBarrier() {
- if (mMessageQueue == null) return;
- // As barrier detection is only used for tracing, early out when tracing
- // is disabled to avoid any potential performance penalties.
- if (!TraceEvent.enabled()) {
- mQueueHasSyncBarrier = false;
- return;
- }
- Message queueHead = (Message) getField(mMessageQueue, mMessageQueueMessageField);
- setqueueHasSyncBarrier(isSyncBarrierMessage(queueHead));
- }
-
- private boolean isSyncBarrierMessage(Message message) {
- if (message == null) return false;
- // Sync barrier messages have null targets.
- return getField(message, mMessageTargetField) == null;
- }
-
- private void tryEnableSyncBarrierDetection() {
- assert mMessageQueue == null;
-
- boolean success = false;
- try {
- Method getQueueMethod = Looper.class.getMethod("getQueue", new Class[]{});
- mMessageQueue = (MessageQueue) getQueueMethod.invoke(getLooper());
-
- mMessageQueueMessageField = mMessageQueue.getClass().getDeclaredField("mMessages");
- mMessageQueueMessageField.setAccessible(true);
-
- mMessageTargetField = Message.class.getDeclaredField("target");
- mMessageTargetField.setAccessible(true);
-
- mSyncBarrierTraceId = hashCode();
-
- success = true;
- } catch (NoSuchMethodException e) {
- Log.e(TAG, "Failed to load method: " + e);
- } catch (NoSuchFieldException e) {
- Log.e(TAG, "Failed to load field: " + e);
- } catch (InvocationTargetException e) {
- Log.e(TAG, "Failed invocation: " + e);
- } catch (IllegalAccessException e) {
- Log.e(TAG, "Illegal access to reflected invocation: " + e);
- } catch (IllegalArgumentException e) {
- Log.e(TAG, "Illegal argument to reflected invocation: " + e);
- } catch (RuntimeException e) {
- Log.e(TAG, e.toString());
- } finally {
- if (!success) disableSyncBarrierDetection();
- }
- }
-
- private void disableSyncBarrierDetection() {
- Log.e(TAG, "Unexpected error with sync barrier detection, disabling.");
- mMessageQueue = null;
- mMessageQueueMessageField = null;
- mMessageTargetField = null;
- setqueueHasSyncBarrier(false);
- }
-
- private void setqueueHasSyncBarrier(boolean queueHasSyncBarrier) {
- if (queueHasSyncBarrier == mQueueHasSyncBarrier) return;
- mQueueHasSyncBarrier = queueHasSyncBarrier;
- if (mQueueHasSyncBarrier) {
- TraceEvent.startAsync("SyncBarrier", mSyncBarrierTraceId);
- } else {
- TraceEvent.finishAsync("SyncBarrier", mSyncBarrierTraceId);
- }
- }
-
- private Object getField(Object object, Field field) {
- try {
- return field.get(object);
- } catch (IllegalAccessException e) {
- Log.e(TAG, "Failed field access: " + e);
- disableSyncBarrierDetection();
- }
- return null;
- }
-
@CalledByNative
private static SystemMessageHandler create(long messagePumpDelegateNative) {
return new SystemMessageHandler(messagePumpDelegateNative);