| Index: base/android/java/src/org/chromium/base/EarlyTraceEvent.java
|
| diff --git a/base/android/java/src/org/chromium/base/EarlyTraceEvent.java b/base/android/java/src/org/chromium/base/EarlyTraceEvent.java
|
| deleted file mode 100644
|
| index b9bd7967f86f2dfd8eaaf05b1d6ba44018def780..0000000000000000000000000000000000000000
|
| --- a/base/android/java/src/org/chromium/base/EarlyTraceEvent.java
|
| +++ /dev/null
|
| @@ -1,179 +0,0 @@
|
| -// Copyright 2016 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -package org.chromium.base;
|
| -
|
| -import android.os.Process;
|
| -import android.os.StrictMode;
|
| -import android.os.SystemClock;
|
| -
|
| -import org.chromium.base.annotations.JNINamespace;
|
| -import org.chromium.base.annotations.SuppressFBWarnings;
|
| -
|
| -import java.io.File;
|
| -import java.util.ArrayList;
|
| -import java.util.HashMap;
|
| -import java.util.List;
|
| -import java.util.Map;
|
| -
|
| -/** Support for early tracing, before the native library is loaded.
|
| - *
|
| - * This is limited, as:
|
| - * - Arguments are not supported
|
| - * - Thread time is not reported
|
| - * - Two events with the same name cannot be in progress at the same time.
|
| - *
|
| - * Events recorded here are buffered in Java until the native library is available. Then it waits
|
| - * for the completion of pending events, and sends the events to the native side.
|
| - *
|
| - * Locking: This class is threadsafe. It is enabled when general tracing is, and then disabled when
|
| - * tracing is enabled from the native side. Event completions are still processed as long
|
| - * as some are pending, then early tracing is permanently disabled after dumping the
|
| - * events. This means that if any early event is still pending when tracing is disabled,
|
| - * all early events are dropped.
|
| - */
|
| -@JNINamespace("base::android")
|
| -public class EarlyTraceEvent {
|
| - // Must be kept in sync with the native kAndroidTraceConfigFile.
|
| - private static final String TRACE_CONFIG_FILENAME = "/data/local/chrome-trace-config.json";
|
| -
|
| - /** Single trace event. */
|
| - @VisibleForTesting
|
| - static final class Event {
|
| - final String mName;
|
| - final int mThreadId;
|
| - final long mBeginTimeMs;
|
| - long mEndTimeMs;
|
| -
|
| - Event(String name) {
|
| - mName = name;
|
| - mThreadId = Process.myTid();
|
| - mBeginTimeMs = SystemClock.elapsedRealtime();
|
| - }
|
| -
|
| - void end() {
|
| - assert mEndTimeMs == 0;
|
| - mEndTimeMs = SystemClock.elapsedRealtime();
|
| - }
|
| - }
|
| -
|
| - // State transitions are:
|
| - // - enable(): DISABLED -> ENABLED
|
| - // - disable(): ENABLED -> FINISHING
|
| - // - Once there are no pending events: FINISHING -> FINISHED.
|
| - @VisibleForTesting static final int STATE_DISABLED = 0;
|
| - @VisibleForTesting static final int STATE_ENABLED = 1;
|
| - @VisibleForTesting static final int STATE_FINISHING = 2;
|
| - @VisibleForTesting static final int STATE_FINISHED = 3;
|
| -
|
| - // Locks the fields below.
|
| - private static final Object sLock = new Object();
|
| -
|
| - @VisibleForTesting static volatile int sState = STATE_DISABLED;
|
| - // Not final as these object are not likely to be used at all.
|
| - @VisibleForTesting static List<Event> sCompletedEvents;
|
| - @VisibleForTesting static Map<String, Event> sPendingEvents;
|
| -
|
| - /** @see TraceEvent#MaybeEnableEarlyTracing().
|
| - */
|
| - @SuppressFBWarnings("DMI_HARDCODED_ABSOLUTE_FILENAME")
|
| - static void maybeEnable() {
|
| - boolean shouldEnable = false;
|
| - // Checking for the trace config filename touches the disk.
|
| - StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads();
|
| - try {
|
| - CommandLine commandLine = CommandLine.getInstance();
|
| - if (commandLine != null && commandLine.hasSwitch("trace-startup")) {
|
| - shouldEnable = true;
|
| - } else {
|
| - try {
|
| - shouldEnable = (new File(TRACE_CONFIG_FILENAME)).exists();
|
| - } catch (SecurityException e) {
|
| - // Access denied, not enabled.
|
| - }
|
| - }
|
| - } finally {
|
| - StrictMode.setThreadPolicy(oldPolicy);
|
| - }
|
| - if (shouldEnable) enable();
|
| - }
|
| -
|
| - @VisibleForTesting
|
| - static void enable() {
|
| - synchronized (sLock) {
|
| - if (sState != STATE_DISABLED) return;
|
| - sCompletedEvents = new ArrayList<Event>();
|
| - sPendingEvents = new HashMap<String, Event>();
|
| - sState = STATE_ENABLED;
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Disables Early tracing.
|
| - *
|
| - * Once this is called, no new event will be registered. However, end() calls are still recorded
|
| - * as long as there are pending events. Once there are none left, pass the events to the native
|
| - * side.
|
| - */
|
| - static void disable() {
|
| - synchronized (sLock) {
|
| - if (sState != STATE_ENABLED) return;
|
| - sState = STATE_FINISHING;
|
| - maybeFinishLocked();
|
| - }
|
| - }
|
| -
|
| - /** @see {@link TraceEvent#begin()}. */
|
| - public static void begin(String name) {
|
| - // begin() and end() are going to be called once per TraceEvent, this avoids entering a
|
| - // synchronized block at each and every call.
|
| - if (sState != STATE_ENABLED) return;
|
| - Event event = new Event(name);
|
| - Event conflictingEvent;
|
| - synchronized (sLock) {
|
| - if (sState != STATE_ENABLED) return;
|
| - conflictingEvent = sPendingEvents.put(name, event);
|
| - }
|
| - if (conflictingEvent != null) {
|
| - throw new IllegalArgumentException(
|
| - "Multiple pending trace events can't have the same name");
|
| - }
|
| - }
|
| -
|
| - /** @see {@link TraceEvent#end()}. */
|
| - public static void end(String name) {
|
| - int state = sState;
|
| - if (state != STATE_ENABLED && state != STATE_FINISHING) return;
|
| - synchronized (sLock) {
|
| - if (sState != STATE_ENABLED && sState != STATE_FINISHING) return;
|
| - Event event = sPendingEvents.remove(name);
|
| - if (event == null) return;
|
| - event.end();
|
| - sCompletedEvents.add(event);
|
| - if (sState == STATE_FINISHING) maybeFinishLocked();
|
| - }
|
| - }
|
| -
|
| - private static void maybeFinishLocked() {
|
| - if (!sPendingEvents.isEmpty()) return;
|
| - sState = STATE_FINISHED;
|
| - dumpEvents(sCompletedEvents);
|
| - sCompletedEvents = null;
|
| - sPendingEvents = null;
|
| - }
|
| -
|
| - private static void dumpEvents(List<Event> events) {
|
| - long nativeNowUs = nativeGetTimeTicksNowUs();
|
| - long javaNowUs = SystemClock.elapsedRealtime() * 1000;
|
| - long offsetMs = (nativeNowUs - javaNowUs) / 1000;
|
| - for (Event event : events) {
|
| - nativeRecordEarlyEvent(event.mName, event.mBeginTimeMs + offsetMs,
|
| - event.mEndTimeMs + offsetMs, event.mThreadId);
|
| - }
|
| - }
|
| -
|
| - private static native long nativeGetTimeTicksNowUs();
|
| - private static native void nativeRecordEarlyEvent(
|
| - String name, long beginTimeMs, long endTimeMs, int threadId);
|
| -}
|
|
|