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 |