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 #ifndef VM_TIMELINE_H_ | 5 #ifndef VM_TIMELINE_H_ |
6 #define VM_TIMELINE_H_ | 6 #define VM_TIMELINE_H_ |
7 | 7 |
8 #include "vm/allocation.h" | 8 #include "vm/allocation.h" |
9 #include "vm/bitfield.h" | 9 #include "vm/bitfield.h" |
10 #include "vm/os.h" | 10 #include "vm/os.h" |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
42 // Shutdown timeline system. Not thread safe. | 42 // Shutdown timeline system. Not thread safe. |
43 static void Shutdown(); | 43 static void Shutdown(); |
44 | 44 |
45 // Access the global recorder. Not thread safe. | 45 // Access the global recorder. Not thread safe. |
46 static TimelineEventRecorder* recorder(); | 46 static TimelineEventRecorder* recorder(); |
47 | 47 |
48 static bool EnableStreamByDefault(const char* stream_name); | 48 static bool EnableStreamByDefault(const char* stream_name); |
49 | 49 |
50 static TimelineStream* GetVMStream(); | 50 static TimelineStream* GetVMStream(); |
51 | 51 |
52 // Reclaim all |TimelineEventBlock|s that are owned by the current isolate. | 52 // Reclaim all |TimelineEventBlocks|s that are cached by threads. |
53 static void ReclaimIsolateBlocks(); | 53 static void ReclaimCachedBlocksFromThreads(); |
54 | |
55 // Reclaim all |TimelineEventBlocks|s that are owned by all isolates and | |
56 // the global block owned by the VM. | |
57 static void ReclaimAllBlocks(); | |
58 | 54 |
59 #define ISOLATE_TIMELINE_STREAM_FLAGS(name, not_used) \ | 55 #define ISOLATE_TIMELINE_STREAM_FLAGS(name, not_used) \ |
60 static const bool* Stream##name##EnabledFlag() { \ | 56 static const bool* Stream##name##EnabledFlag() { \ |
61 return &stream_##name##_enabled_; \ | 57 return &stream_##name##_enabled_; \ |
62 } \ | 58 } \ |
63 static void SetStream##name##Enabled(bool enabled) { \ | 59 static void SetStream##name##Enabled(bool enabled) { \ |
64 stream_##name##_enabled_ = enabled; \ | 60 stream_##name##_enabled_ = enabled; \ |
65 } | 61 } |
66 ISOLATE_TIMELINE_STREAM_LIST(ISOLATE_TIMELINE_STREAM_FLAGS) | 62 ISOLATE_TIMELINE_STREAM_LIST(ISOLATE_TIMELINE_STREAM_FLAGS) |
67 #undef ISOLATE_TIMELINE_STREAM_FLAGS | 63 #undef ISOLATE_TIMELINE_STREAM_FLAGS |
68 | 64 |
69 private: | 65 private: |
70 static void ReclaimBlocksForIsolate(Isolate* isolate); | |
71 | |
72 static TimelineEventRecorder* recorder_; | 66 static TimelineEventRecorder* recorder_; |
73 static TimelineStream* vm_stream_; | 67 static TimelineStream* vm_stream_; |
74 | 68 |
75 #define ISOLATE_TIMELINE_STREAM_DECLARE_FLAG(name, not_used) \ | 69 #define ISOLATE_TIMELINE_STREAM_DECLARE_FLAG(name, not_used) \ |
76 static bool stream_##name##_enabled_; | 70 static bool stream_##name##_enabled_; |
77 ISOLATE_TIMELINE_STREAM_LIST(ISOLATE_TIMELINE_STREAM_DECLARE_FLAG) | 71 ISOLATE_TIMELINE_STREAM_LIST(ISOLATE_TIMELINE_STREAM_DECLARE_FLAG) |
78 #undef ISOLATE_TIMELINE_STREAM_DECLARE_FLAG | 72 #undef ISOLATE_TIMELINE_STREAM_DECLARE_FLAG |
79 | 73 |
80 friend class TimelineRecorderOverride; | 74 friend class TimelineRecorderOverride; |
81 friend class ReclaimBlocksIsolateVisitor; | 75 friend class ReclaimBlocksIsolateVisitor; |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
244 | 238 |
245 void StreamInit(TimelineStream* stream); | 239 void StreamInit(TimelineStream* stream); |
246 void Init(EventType event_type, const char* label); | 240 void Init(EventType event_type, const char* label); |
247 | 241 |
248 void set_event_type(EventType event_type) { | 242 void set_event_type(EventType event_type) { |
249 // We only reserve 4 bits to hold the event type. | 243 // We only reserve 4 bits to hold the event type. |
250 COMPILE_ASSERT(kNumEventTypes < 16); | 244 COMPILE_ASSERT(kNumEventTypes < 16); |
251 state_ = EventTypeField::update(event_type, state_); | 245 state_ = EventTypeField::update(event_type, state_); |
252 } | 246 } |
253 | 247 |
254 void set_global_block(bool global_block) { | |
255 state_ = GlobalBlockField::update(global_block, state_); | |
256 } | |
257 | |
258 bool global_block() const { | |
259 return GlobalBlockField::decode(state_); | |
260 } | |
261 | |
262 enum StateBits { | 248 enum StateBits { |
263 kEventTypeBit = 0, // reserve 4 bits for type. | 249 kEventTypeBit = 0, // reserve 4 bits for type. |
264 // Was this event allocated from the global block? | 250 kNextBit = 4, |
265 kGlobalBlockBit = 4, | |
266 kNextBit = 5, | |
267 }; | 251 }; |
268 | 252 |
269 class EventTypeField : public BitField<EventType, kEventTypeBit, 4> {}; | 253 class EventTypeField : public BitField<EventType, kEventTypeBit, 4> {}; |
270 class GlobalBlockField : public BitField<bool, kGlobalBlockBit, 1> {}; | |
271 | 254 |
272 friend class TimelineEventRecorder; | 255 friend class TimelineEventRecorder; |
273 friend class TimelineEventEndlessRecorder; | 256 friend class TimelineEventEndlessRecorder; |
274 friend class TimelineEventRingRecorder; | 257 friend class TimelineEventRingRecorder; |
275 friend class TimelineStream; | 258 friend class TimelineStream; |
276 friend class TimelineTestHelper; | 259 friend class TimelineTestHelper; |
277 DISALLOW_COPY_AND_ASSIGN(TimelineEvent); | 260 DISALLOW_COPY_AND_ASSIGN(TimelineEvent); |
278 }; | 261 }; |
279 | 262 |
280 | 263 |
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
564 virtual TimelineEvent* StartEvent() = 0; | 547 virtual TimelineEvent* StartEvent() = 0; |
565 virtual void CompleteEvent(TimelineEvent* event) = 0; | 548 virtual void CompleteEvent(TimelineEvent* event) = 0; |
566 virtual TimelineEventBlock* GetHeadBlockLocked() = 0; | 549 virtual TimelineEventBlock* GetHeadBlockLocked() = 0; |
567 virtual TimelineEventBlock* GetNewBlockLocked(Isolate* isolate) = 0; | 550 virtual TimelineEventBlock* GetNewBlockLocked(Isolate* isolate) = 0; |
568 virtual intptr_t NumDartEventsLocked() = 0; | 551 virtual intptr_t NumDartEventsLocked() = 0; |
569 virtual DartTimelineEvent* DartEventAtLocked(intptr_t i) = 0; | 552 virtual DartTimelineEvent* DartEventAtLocked(intptr_t i) = 0; |
570 | 553 |
571 // Utility method(s). | 554 // Utility method(s). |
572 void PrintJSONMeta(JSONArray* array) const; | 555 void PrintJSONMeta(JSONArray* array) const; |
573 TimelineEvent* ThreadBlockStartEvent(); | 556 TimelineEvent* ThreadBlockStartEvent(); |
574 TimelineEvent* GlobalBlockStartEvent(); | |
575 void ThreadBlockCompleteEvent(TimelineEvent* event); | 557 void ThreadBlockCompleteEvent(TimelineEvent* event); |
576 void GlobalBlockCompleteEvent(TimelineEvent* event); | |
577 | 558 |
578 Mutex lock_; | 559 Mutex lock_; |
579 // Only accessed under |lock_|. | |
580 TimelineEventBlock* global_block_; | |
581 void ReclaimGlobalBlock(); | |
582 | |
583 uintptr_t async_id_; | 560 uintptr_t async_id_; |
584 | 561 |
585 friend class DartTimelineEventIterator; | 562 friend class DartTimelineEventIterator; |
586 friend class TimelineEvent; | 563 friend class TimelineEvent; |
587 friend class TimelineEventBlockIterator; | 564 friend class TimelineEventBlockIterator; |
588 friend class TimelineStream; | 565 friend class TimelineStream; |
589 friend class TimelineTestHelper; | 566 friend class TimelineTestHelper; |
590 friend class Timeline; | 567 friend class Timeline; |
591 | 568 |
592 private: | 569 private: |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
737 | 714 |
738 private: | 715 private: |
739 intptr_t cursor_; | 716 intptr_t cursor_; |
740 intptr_t num_events_; | 717 intptr_t num_events_; |
741 TimelineEventRecorder* recorder_; | 718 TimelineEventRecorder* recorder_; |
742 }; | 719 }; |
743 | 720 |
744 } // namespace dart | 721 } // namespace dart |
745 | 722 |
746 #endif // VM_TIMELINE_H_ | 723 #endif // VM_TIMELINE_H_ |
OLD | NEW |