| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package org.chromium.base; | 5 package org.chromium.base; |
| 6 | 6 |
| 7 import android.annotation.SuppressLint; |
| 8 import android.os.Build; |
| 7 import android.os.Process; | 9 import android.os.Process; |
| 8 import android.os.StrictMode; | 10 import android.os.StrictMode; |
| 9 import android.os.SystemClock; | 11 import android.os.SystemClock; |
| 10 | 12 |
| 11 import org.chromium.base.annotations.JNINamespace; | 13 import org.chromium.base.annotations.JNINamespace; |
| 12 import org.chromium.base.annotations.MainDex; | 14 import org.chromium.base.annotations.MainDex; |
| 13 import org.chromium.base.annotations.SuppressFBWarnings; | 15 import org.chromium.base.annotations.SuppressFBWarnings; |
| 14 | 16 |
| 15 import java.io.File; | 17 import java.io.File; |
| 16 import java.util.ArrayList; | 18 import java.util.ArrayList; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 38 @MainDex | 40 @MainDex |
| 39 public class EarlyTraceEvent { | 41 public class EarlyTraceEvent { |
| 40 // Must be kept in sync with the native kAndroidTraceConfigFile. | 42 // Must be kept in sync with the native kAndroidTraceConfigFile. |
| 41 private static final String TRACE_CONFIG_FILENAME = "/data/local/chrome-trac
e-config.json"; | 43 private static final String TRACE_CONFIG_FILENAME = "/data/local/chrome-trac
e-config.json"; |
| 42 | 44 |
| 43 /** Single trace event. */ | 45 /** Single trace event. */ |
| 44 @VisibleForTesting | 46 @VisibleForTesting |
| 45 static final class Event { | 47 static final class Event { |
| 46 final String mName; | 48 final String mName; |
| 47 final int mThreadId; | 49 final int mThreadId; |
| 48 final long mBeginTimeMs; | 50 final long mBeginTimeNanos; |
| 49 long mEndTimeMs; | 51 final long mBeginThreadTimeMillis; |
| 52 long mEndTimeNanos; |
| 53 long mEndThreadTimeMillis; |
| 50 | 54 |
| 51 Event(String name) { | 55 Event(String name) { |
| 52 mName = name; | 56 mName = name; |
| 53 mThreadId = Process.myTid(); | 57 mThreadId = Process.myTid(); |
| 54 mBeginTimeMs = SystemClock.elapsedRealtime(); | 58 mBeginTimeNanos = elapsedRealtimeNanos(); |
| 59 mBeginThreadTimeMillis = SystemClock.currentThreadTimeMillis(); |
| 55 } | 60 } |
| 56 | 61 |
| 57 void end() { | 62 void end() { |
| 58 assert mEndTimeMs == 0; | 63 assert mEndTimeNanos == 0; |
| 59 mEndTimeMs = SystemClock.elapsedRealtime(); | 64 assert mEndThreadTimeMillis == 0; |
| 65 mEndTimeNanos = elapsedRealtimeNanos(); |
| 66 mEndThreadTimeMillis = SystemClock.currentThreadTimeMillis(); |
| 67 } |
| 68 |
| 69 @SuppressLint("NewApi") |
| 70 private static long elapsedRealtimeNanos() { |
| 71 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { |
| 72 return SystemClock.elapsedRealtimeNanos(); |
| 73 } else { |
| 74 return SystemClock.elapsedRealtime() * 1000000; |
| 75 } |
| 60 } | 76 } |
| 61 } | 77 } |
| 62 | 78 |
| 63 // State transitions are: | 79 // State transitions are: |
| 64 // - enable(): DISABLED -> ENABLED | 80 // - enable(): DISABLED -> ENABLED |
| 65 // - disable(): ENABLED -> FINISHING | 81 // - disable(): ENABLED -> FINISHING |
| 66 // - Once there are no pending events: FINISHING -> FINISHED. | 82 // - Once there are no pending events: FINISHING -> FINISHED. |
| 67 @VisibleForTesting static final int STATE_DISABLED = 0; | 83 @VisibleForTesting static final int STATE_DISABLED = 0; |
| 68 @VisibleForTesting static final int STATE_ENABLED = 1; | 84 @VisibleForTesting static final int STATE_ENABLED = 1; |
| 69 @VisibleForTesting static final int STATE_FINISHING = 2; | 85 @VisibleForTesting static final int STATE_FINISHING = 2; |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 169 | 185 |
| 170 private static void maybeFinishLocked() { | 186 private static void maybeFinishLocked() { |
| 171 if (!sPendingEvents.isEmpty()) return; | 187 if (!sPendingEvents.isEmpty()) return; |
| 172 sState = STATE_FINISHED; | 188 sState = STATE_FINISHED; |
| 173 dumpEvents(sCompletedEvents); | 189 dumpEvents(sCompletedEvents); |
| 174 sCompletedEvents = null; | 190 sCompletedEvents = null; |
| 175 sPendingEvents = null; | 191 sPendingEvents = null; |
| 176 } | 192 } |
| 177 | 193 |
| 178 private static void dumpEvents(List<Event> events) { | 194 private static void dumpEvents(List<Event> events) { |
| 179 long nativeNowUs = TimeUtils.nativeGetTimeTicksNowUs(); | 195 long nativeNowNanos = TimeUtils.nativeGetTimeTicksNowUs() * 1000; |
| 180 long javaNowUs = SystemClock.elapsedRealtime() * 1000; | 196 long javaNowNanos = Event.elapsedRealtimeNanos(); |
| 181 long offsetMs = (nativeNowUs - javaNowUs) / 1000; | 197 long offsetNanos = nativeNowNanos - javaNowNanos; |
| 182 for (Event event : events) { | 198 for (Event e : events) { |
| 183 nativeRecordEarlyEvent(event.mName, event.mBeginTimeMs + offsetMs, | 199 nativeRecordEarlyEvent(e.mName, e.mBeginTimeNanos + offsetNanos, |
| 184 event.mEndTimeMs + offsetMs, event.mThreadId); | 200 e.mEndTimeNanos + offsetNanos, e.mThreadId, |
| 201 e.mEndThreadTimeMillis - e.mBeginThreadTimeMillis); |
| 185 } | 202 } |
| 186 } | 203 } |
| 187 | 204 |
| 188 private static native void nativeRecordEarlyEvent( | 205 private static native void nativeRecordEarlyEvent(String name, long beginTim
Nanos, |
| 189 String name, long beginTimeMs, long endTimeMs, int threadId); | 206 long endTimeNanos, int threadId, long threadDurationMillis); |
| 190 } | 207 } |
| OLD | NEW |