diff options
author | jdduke <jdduke@chromium.org> | 2014-11-13 09:32:01 -0800 |
---|---|---|
committer | Bo Liu <boliu@google.com> | 2014-11-13 15:33:50 -0800 |
commit | 7a4903d2d8aef7ca5e09f0f5ceed845ce4625934 (patch) | |
tree | 14cd3f548fbb0efb11624a21ffdd27bb1c5a3102 | |
parent | 3eaa0a6864d789c352be4a8216f2797a475e01e0 (diff) | |
download | chromium_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.java | 107 |
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); |