OLD | NEW |
---|---|
(Empty) | |
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 | |
3 // BSD-style license that can be found in the LICENSE file. | |
4 | |
5 #ifndef VM_TIMELINE_H_ | |
6 #define VM_TIMELINE_H_ | |
7 | |
8 #include "vm/bitfield.h" | |
9 | |
10 namespace dart { | |
11 | |
12 class JSONStream; | |
13 class Object; | |
14 class RawArray; | |
15 class Thread; | |
16 class TimelineEvent; | |
17 class TimelineEventBuffer; | |
18 class TimelineStream; | |
19 | |
20 class TimelineEvent { | |
21 public: | |
22 // Keep in sync with StateBits below. | |
23 enum EventType { | |
24 kNone = 0, | |
25 kDuration = 1, | |
26 kInstant = 2, | |
27 }; | |
28 | |
29 void Reset(); | |
30 | |
31 bool IsValid() const { | |
32 return (event_type() >= kDuration) && (event_type() <= kInstant); | |
33 } | |
34 | |
35 void DurationBegin(TimelineStream* stream, const char* label); | |
36 void DurationEnd(); | |
37 void Instant(TimelineStream* stream, const char* label); | |
38 | |
39 void SetArgument(const char* name, const char* value); | |
40 | |
41 EventType event_type() const { | |
42 return EventTypeField::decode(state_); | |
43 } | |
44 | |
45 void PrintJSON(JSONStream* stream); | |
siva
2015/06/09 22:37:56
const function
Cutch
2015/06/10 18:20:56
Done.
| |
46 | |
47 private: | |
48 int64_t timestamp0_; | |
49 int64_t timestamp1_; | |
50 uword state_; | |
51 const char* label_; | |
52 TimelineStream* stream_; | |
53 Thread* thread_; | |
54 const char* arg_name_; | |
55 const char* arg_value_; | |
56 | |
57 void Init(EventType event_type, TimelineStream* stream, const char* label); | |
58 | |
59 void set_event_type(EventType event_type) { | |
60 state_ = EventTypeField::update(event_type, state_); | |
61 } | |
62 | |
63 enum StateBits { | |
64 kEventTypeBit = 0, | |
65 // reserve 4 bits for type. | |
66 kNextBit = 4, | |
67 }; | |
68 | |
69 class EventTypeField : public BitField<EventType, kEventTypeBit, 4> {}; | |
70 | |
71 DISALLOW_COPY_AND_ASSIGN(TimelineEvent); | |
72 }; | |
73 | |
74 | |
75 // A stream of timeline events. A stream has a name and can be enabled or | |
76 // disabled. | |
77 class TimelineStream { | |
78 public: | |
79 TimelineStream(); | |
80 | |
81 void Init(const char* name, bool enabled); | |
82 | |
83 const char* name() const { | |
84 return name_; | |
85 } | |
86 | |
87 bool enabled() const { | |
88 return enabled_; | |
89 } | |
90 | |
91 void set_enabled(bool enabled) { | |
92 enabled_ = enabled; | |
93 } | |
94 | |
95 TimelineEventBuffer* buffer() const { | |
96 return buffer_; | |
97 } | |
98 | |
99 void set_buffer(TimelineEventBuffer* buffer) { | |
100 buffer_ = buffer; | |
101 } | |
102 | |
103 // Records an event. Will return |NULL| if not enabled. The returned | |
104 // |TimelineEvent| is in an undefined state and must be initialized. | |
105 // |obj| is associated with the returned |TimelineEvent|. | |
106 TimelineEvent* RecordEvent(const Object& obj); | |
107 | |
108 // Records an event. Will return |NULL| if not enabled. The returned | |
109 // |TimelineEvent| is in an undefined state and must be initialized. | |
110 TimelineEvent* RecordEvent(); | |
111 | |
112 private: | |
113 // Buffer of TimelineEvents. | |
114 TimelineEventBuffer* buffer_; | |
115 const char* name_; | |
116 bool enabled_; | |
117 }; | |
118 | |
119 | |
120 // name, enabled by default. | |
121 #define ISOLATE_TIMELINE_STREAM_LIST(V) \ | |
122 V(API, true) \ | |
123 V(Compiler, true) \ | |
124 V(GC, true) \ | |
125 | |
126 | |
127 class TimelineDurationScope : public ValueObject { | |
128 public: | |
129 TimelineDurationScope(TimelineStream* stream, const char* label) { | |
130 event_ = stream->RecordEvent(); | |
131 if (event_ == NULL) { | |
132 return; | |
133 } | |
134 event_->DurationBegin(stream, label); | |
135 } | |
136 | |
137 void SetArgument(const char* arg_name, const char* arg_value) { | |
138 if (event_ == NULL) { | |
139 return; | |
140 } | |
141 event_->SetArgument(arg_name, arg_value); | |
142 } | |
143 | |
144 ~TimelineDurationScope() { | |
145 if (event_ == NULL) { | |
146 return; | |
147 } | |
148 event_->DurationEnd(); | |
149 } | |
150 | |
151 private: | |
152 TimelineEvent* event_; | |
153 }; | |
154 | |
155 | |
156 class TimelineEventBuffer { | |
157 public: | |
158 static const intptr_t kDefaultCapacity = 8192; | |
159 | |
160 static intptr_t SizeForCapacity(intptr_t capacity); | |
161 | |
162 explicit TimelineEventBuffer(intptr_t capacity = kDefaultCapacity); | |
163 ~TimelineEventBuffer(); | |
164 | |
165 void Dump(); | |
166 | |
167 private: | |
168 // events_[i] and event_objects_[i] are indexed together. | |
169 TimelineEvent* events_; | |
170 RawArray* event_objects_; | |
171 uintptr_t cursor_; | |
172 intptr_t capacity_; | |
173 | |
174 void DumpMeta(JSONArray* array); | |
175 void DumpEvents(JSONArray* array); | |
176 | |
177 intptr_t GetNextIndex(); | |
178 void VisitObjectPointers(ObjectPointerVisitor* visitor); | |
179 TimelineEvent* RecordEvent(const Object& obj); | |
180 TimelineEvent* RecordEvent(); | |
181 | |
182 friend class TimelineStream; | |
183 friend class Isolate; | |
184 DISALLOW_COPY_AND_ASSIGN(TimelineEventBuffer); | |
185 }; | |
186 | |
187 } // namespace dart | |
188 | |
189 #endif // VM_TIMELINE_H_ | |
OLD | NEW |