Index: base/android/java/src/org/chromium/base/SystemMessageHandler.java |
diff --git a/base/android/java/src/org/chromium/base/SystemMessageHandler.java b/base/android/java/src/org/chromium/base/SystemMessageHandler.java |
index 10f8d55448e014b8d9717d34197428fbf4bd9200..e1fbb0f4bed9538212313fdb374e81f0ac37f414 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); |