OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include <cstring> | 5 #include <cstring> |
6 | 6 |
7 #include "platform/assert.h" | 7 #include "platform/assert.h" |
8 | 8 |
9 #include "vm/dart_api_impl.h" | 9 #include "vm/dart_api_impl.h" |
10 #include "vm/dart_api_state.h" | 10 #include "vm/dart_api_state.h" |
11 #include "vm/globals.h" | 11 #include "vm/globals.h" |
12 #include "vm/timeline.h" | 12 #include "vm/timeline.h" |
13 #include "vm/timeline_analysis.h" | 13 #include "vm/timeline_analysis.h" |
14 #include "vm/unit_test.h" | 14 #include "vm/unit_test.h" |
15 | 15 |
16 namespace dart { | 16 namespace dart { |
17 | 17 |
18 #ifndef PRODUCT | 18 #ifndef PRODUCT |
19 | 19 |
20 class TimelineRecorderOverride : public ValueObject { | 20 class TimelineRecorderOverride : public ValueObject { |
21 public: | 21 public: |
22 explicit TimelineRecorderOverride(TimelineEventRecorder* new_recorder) | 22 explicit TimelineRecorderOverride(TimelineEventRecorder* new_recorder) |
23 : recorder_(Timeline::recorder()) { | 23 : recorder_(Timeline::recorder()) { |
24 Timeline::recorder_ = new_recorder; | 24 Timeline::recorder_ = new_recorder; |
25 } | 25 } |
26 | 26 |
27 ~TimelineRecorderOverride() { | 27 ~TimelineRecorderOverride() { Timeline::recorder_ = recorder_; } |
28 Timeline::recorder_ = recorder_; | |
29 } | |
30 | 28 |
31 private: | 29 private: |
32 TimelineEventRecorder* recorder_; | 30 TimelineEventRecorder* recorder_; |
33 }; | 31 }; |
34 | 32 |
35 | 33 |
36 class TimelineTestHelper : public AllStatic { | 34 class TimelineTestHelper : public AllStatic { |
37 public: | 35 public: |
38 static void SetStream(TimelineEvent* event, TimelineStream* stream) { | 36 static void SetStream(TimelineEvent* event, TimelineStream* stream) { |
39 event->StreamInit(stream); | 37 event->StreamInit(stream); |
40 } | 38 } |
41 | 39 |
42 static void FakeThreadEvent( | 40 static void FakeThreadEvent(TimelineEventBlock* block, |
43 TimelineEventBlock* block, | 41 intptr_t ftid, |
44 intptr_t ftid, | 42 const char* label = "fake", |
45 const char* label = "fake", | 43 TimelineStream* stream = NULL) { |
46 TimelineStream* stream = NULL) { | |
47 TimelineEvent* event = block->StartEvent(); | 44 TimelineEvent* event = block->StartEvent(); |
48 ASSERT(event != NULL); | 45 ASSERT(event != NULL); |
49 event->DurationBegin(label); | 46 event->DurationBegin(label); |
50 event->thread_ = OSThread::ThreadIdFromIntPtr(ftid); | 47 event->thread_ = OSThread::ThreadIdFromIntPtr(ftid); |
51 if (stream != NULL) { | 48 if (stream != NULL) { |
52 event->StreamInit(stream); | 49 event->StreamInit(stream); |
53 } | 50 } |
54 } | 51 } |
55 | 52 |
56 static void SetBlockThread(TimelineEventBlock* block, | 53 static void SetBlockThread(TimelineEventBlock* block, intptr_t ftid) { |
57 intptr_t ftid) { | |
58 block->thread_id_ = OSThread::ThreadIdFromIntPtr(ftid); | 54 block->thread_id_ = OSThread::ThreadIdFromIntPtr(ftid); |
59 } | 55 } |
60 | 56 |
61 static void FakeDuration( | 57 static void FakeDuration(TimelineEventRecorder* recorder, |
62 TimelineEventRecorder* recorder, | 58 const char* label, |
63 const char* label, | 59 int64_t start, |
64 int64_t start, | 60 int64_t end) { |
65 int64_t end) { | |
66 ASSERT(recorder != NULL); | 61 ASSERT(recorder != NULL); |
67 ASSERT(start < end); | 62 ASSERT(start < end); |
68 ASSERT(label != NULL); | 63 ASSERT(label != NULL); |
69 TimelineEvent* event = recorder->StartEvent(); | 64 TimelineEvent* event = recorder->StartEvent(); |
70 ASSERT(event != NULL); | 65 ASSERT(event != NULL); |
71 event->Duration(label, start, end); | 66 event->Duration(label, start, end); |
72 event->Complete(); | 67 event->Complete(); |
73 } | 68 } |
74 | 69 |
75 static void FakeBegin( | 70 static void FakeBegin(TimelineEventRecorder* recorder, |
76 TimelineEventRecorder* recorder, | 71 const char* label, |
77 const char* label, | 72 int64_t start) { |
78 int64_t start) { | |
79 ASSERT(recorder != NULL); | 73 ASSERT(recorder != NULL); |
80 ASSERT(label != NULL); | 74 ASSERT(label != NULL); |
81 ASSERT(start >= 0); | 75 ASSERT(start >= 0); |
82 TimelineEvent* event = recorder->StartEvent(); | 76 TimelineEvent* event = recorder->StartEvent(); |
83 ASSERT(event != NULL); | 77 ASSERT(event != NULL); |
84 event->Begin(label, start); | 78 event->Begin(label, start); |
85 event->Complete(); | 79 event->Complete(); |
86 } | 80 } |
87 | 81 |
88 static void FakeEnd( | 82 static void FakeEnd(TimelineEventRecorder* recorder, |
89 TimelineEventRecorder* recorder, | 83 const char* label, |
90 const char* label, | 84 int64_t end) { |
91 int64_t end) { | |
92 ASSERT(recorder != NULL); | 85 ASSERT(recorder != NULL); |
93 ASSERT(label != NULL); | 86 ASSERT(label != NULL); |
94 ASSERT(end >= 0); | 87 ASSERT(end >= 0); |
95 TimelineEvent* event = recorder->StartEvent(); | 88 TimelineEvent* event = recorder->StartEvent(); |
96 ASSERT(event != NULL); | 89 ASSERT(event != NULL); |
97 event->End(label, end); | 90 event->End(label, end); |
98 event->Complete(); | 91 event->Complete(); |
99 } | 92 } |
100 | 93 |
101 static void Clear(TimelineEventEndlessRecorder* recorder) { | 94 static void Clear(TimelineEventEndlessRecorder* recorder) { |
102 ASSERT(recorder != NULL); | 95 ASSERT(recorder != NULL); |
103 recorder->Clear(); | 96 recorder->Clear(); |
104 } | 97 } |
105 | 98 |
106 static void FinishBlock(TimelineEventBlock* block) { | 99 static void FinishBlock(TimelineEventBlock* block) { block->Finish(); } |
107 block->Finish(); | |
108 } | |
109 }; | 100 }; |
110 | 101 |
111 | 102 |
112 TEST_CASE(TimelineEventIsValid) { | 103 TEST_CASE(TimelineEventIsValid) { |
113 // Create a test stream. | 104 // Create a test stream. |
114 TimelineStream stream; | 105 TimelineStream stream; |
115 stream.Init("testStream", true); | 106 stream.Init("testStream", true); |
116 | 107 |
117 TimelineEvent event; | 108 TimelineEvent event; |
118 TimelineTestHelper::SetStream(&event, &stream); | 109 TimelineTestHelper::SetStream(&event, &stream); |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
282 | 273 |
283 // Count the number of each event type seen. | 274 // Count the number of each event type seen. |
284 class EventCounterRecorder : public TimelineEventCallbackRecorder { | 275 class EventCounterRecorder : public TimelineEventCallbackRecorder { |
285 public: | 276 public: |
286 EventCounterRecorder() { | 277 EventCounterRecorder() { |
287 for (intptr_t i = 0; i < TimelineEvent::kNumEventTypes; i++) { | 278 for (intptr_t i = 0; i < TimelineEvent::kNumEventTypes; i++) { |
288 counts_[i] = 0; | 279 counts_[i] = 0; |
289 } | 280 } |
290 } | 281 } |
291 | 282 |
292 void OnEvent(TimelineEvent* event) { | 283 void OnEvent(TimelineEvent* event) { counts_[event->event_type()]++; } |
293 counts_[event->event_type()]++; | |
294 } | |
295 | 284 |
296 intptr_t CountFor(TimelineEvent::EventType type) { | 285 intptr_t CountFor(TimelineEvent::EventType type) { return counts_[type]; } |
297 return counts_[type]; | |
298 } | |
299 | 286 |
300 private: | 287 private: |
301 intptr_t counts_[TimelineEvent::kNumEventTypes]; | 288 intptr_t counts_[TimelineEvent::kNumEventTypes]; |
302 }; | 289 }; |
303 | 290 |
304 | 291 |
305 TEST_CASE(TimelineEventCallbackRecorderBasic) { | 292 TEST_CASE(TimelineEventCallbackRecorderBasic) { |
306 EventCounterRecorder* recorder = new EventCounterRecorder(); | 293 EventCounterRecorder* recorder = new EventCounterRecorder(); |
307 TimelineRecorderOverride override(recorder); | 294 TimelineRecorderOverride override(recorder); |
308 | 295 |
309 // Initial counts are all zero. | 296 // Initial counts are all zero. |
310 for (intptr_t i = TimelineEvent::kNone + 1; | 297 for (intptr_t i = TimelineEvent::kNone + 1; i < TimelineEvent::kNumEventTypes; |
311 i < TimelineEvent::kNumEventTypes; | |
312 i++) { | 298 i++) { |
313 EXPECT_EQ(0, recorder->CountFor(static_cast<TimelineEvent::EventType>(i))); | 299 EXPECT_EQ(0, recorder->CountFor(static_cast<TimelineEvent::EventType>(i))); |
314 } | 300 } |
315 | 301 |
316 // Create a test stream. | 302 // Create a test stream. |
317 TimelineStream stream; | 303 TimelineStream stream; |
318 stream.Init("testStream", true); | 304 stream.Init("testStream", true); |
319 | 305 |
320 TimelineEvent* event = NULL; | 306 TimelineEvent* event = NULL; |
321 | 307 |
(...skipping 574 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
896 pauses.Setup(); | 882 pauses.Setup(); |
897 pauses.CalculatePauseTimesForThread(tid); | 883 pauses.CalculatePauseTimesForThread(tid); |
898 EXPECT(pauses.has_error()); | 884 EXPECT(pauses.has_error()); |
899 } | 885 } |
900 TimelineTestHelper::Clear(recorder); | 886 TimelineTestHelper::Clear(recorder); |
901 } | 887 } |
902 | 888 |
903 #endif // !PRODUCT | 889 #endif // !PRODUCT |
904 | 890 |
905 } // namespace dart | 891 } // namespace dart |
OLD | NEW |