| 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 "include/dart_tools_api.h" | 8 #include "include/dart_tools_api.h" |
| 9 | 9 |
| 10 #include "vm/allocation.h" | 10 #include "vm/allocation.h" |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 149 // Marks an instantaneous event associated with |async_id|. | 149 // Marks an instantaneous event associated with |async_id|. |
| 150 void AsyncInstant(const char* label, | 150 void AsyncInstant(const char* label, |
| 151 int64_t async_id, | 151 int64_t async_id, |
| 152 int64_t micros = OS::GetCurrentMonotonicMicros()); | 152 int64_t micros = OS::GetCurrentMonotonicMicros()); |
| 153 // Marks the end of an asynchronous operation associated with |async_id|. | 153 // Marks the end of an asynchronous operation associated with |async_id|. |
| 154 void AsyncEnd(const char* label, | 154 void AsyncEnd(const char* label, |
| 155 int64_t async_id, | 155 int64_t async_id, |
| 156 int64_t micros = OS::GetCurrentMonotonicMicros()); | 156 int64_t micros = OS::GetCurrentMonotonicMicros()); |
| 157 | 157 |
| 158 void DurationBegin(const char* label, | 158 void DurationBegin(const char* label, |
| 159 int64_t micros = OS::GetCurrentMonotonicMicros()); | 159 int64_t micros = OS::GetCurrentMonotonicMicros(), |
| 160 void DurationEnd(int64_t micros = OS::GetCurrentMonotonicMicros()); | 160 int64_t thread_micros = OS::GetCurrentThreadCPUMicros()); |
| 161 void DurationEnd(int64_t micros = OS::GetCurrentMonotonicMicros(), |
| 162 int64_t thread_micros = OS::GetCurrentThreadCPUMicros()); |
| 163 |
| 161 void Instant(const char* label, | 164 void Instant(const char* label, |
| 162 int64_t micros = OS::GetCurrentMonotonicMicros()); | 165 int64_t micros = OS::GetCurrentMonotonicMicros()); |
| 163 | 166 |
| 164 void Duration(const char* label, | 167 void Duration(const char* label, |
| 165 int64_t start_micros, | 168 int64_t start_micros, |
| 166 int64_t end_micros); | 169 int64_t end_micros, |
| 170 int64_t thread_start_micros = -1, |
| 171 int64_t thread_end_micros = -1); |
| 167 | 172 |
| 168 void Begin(const char* label, | 173 void Begin(const char* label, |
| 169 int64_t micros = OS::GetCurrentMonotonicMicros()); | 174 int64_t micros = OS::GetCurrentMonotonicMicros(), |
| 175 int64_t thread_micros = OS::GetCurrentThreadCPUMicros()); |
| 170 | 176 |
| 171 void End(const char* label, | 177 void End(const char* label, |
| 172 int64_t micros = OS::GetCurrentMonotonicMicros()); | 178 int64_t micros = OS::GetCurrentMonotonicMicros(), |
| 179 int64_t thread_micros = OS::GetCurrentThreadCPUMicros()); |
| 173 | 180 |
| 174 void Counter(const char* label, | 181 void Counter(const char* label, |
| 175 int64_t micros = OS::GetCurrentMonotonicMicros()); | 182 int64_t micros = OS::GetCurrentMonotonicMicros()); |
| 176 | 183 |
| 177 void Metadata(const char* label, | 184 void Metadata(const char* label, |
| 178 int64_t micros = OS::GetCurrentMonotonicMicros()); | 185 int64_t micros = OS::GetCurrentMonotonicMicros()); |
| 179 | 186 |
| 180 // Completes this event with pre-serialized JSON. Copies |json|. | 187 // Completes this event with pre-serialized JSON. Copies |json|. |
| 181 void CompleteWithPreSerializedJSON(const char* json); | 188 void CompleteWithPreSerializedJSON(const char* json); |
| 182 | 189 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 197 void Complete(); | 204 void Complete(); |
| 198 | 205 |
| 199 EventType event_type() const { | 206 EventType event_type() const { |
| 200 return EventTypeField::decode(state_); | 207 return EventTypeField::decode(state_); |
| 201 } | 208 } |
| 202 | 209 |
| 203 bool IsFinishedDuration() const { | 210 bool IsFinishedDuration() const { |
| 204 return (event_type() == kDuration) && (timestamp1_ > timestamp0_); | 211 return (event_type() == kDuration) && (timestamp1_ > timestamp0_); |
| 205 } | 212 } |
| 206 | 213 |
| 214 bool HasThreadCPUTime() const; |
| 215 int64_t ThreadCPUTimeDuration() const; |
| 216 int64_t ThreadCPUTimeOrigin() const; |
| 217 |
| 207 int64_t TimeOrigin() const; | 218 int64_t TimeOrigin() const; |
| 208 int64_t AsyncId() const; | 219 int64_t AsyncId() const; |
| 209 int64_t TimeDuration() const; | 220 int64_t TimeDuration() const; |
| 210 int64_t TimeEnd() const { | 221 int64_t TimeEnd() const { |
| 211 ASSERT(IsFinishedDuration()); | 222 ASSERT(IsFinishedDuration()); |
| 212 return timestamp1_; | 223 return timestamp1_; |
| 213 } | 224 } |
| 214 | 225 |
| 215 void PrintJSON(JSONStream* stream) const; | 226 void PrintJSON(JSONStream* stream) const; |
| 216 | 227 |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 304 | 315 |
| 305 void set_timestamp0(int64_t value) { | 316 void set_timestamp0(int64_t value) { |
| 306 ASSERT(timestamp0_ == 0); | 317 ASSERT(timestamp0_ == 0); |
| 307 timestamp0_ = value; | 318 timestamp0_ = value; |
| 308 } | 319 } |
| 309 void set_timestamp1(int64_t value) { | 320 void set_timestamp1(int64_t value) { |
| 310 ASSERT(timestamp1_ == 0); | 321 ASSERT(timestamp1_ == 0); |
| 311 timestamp1_ = value; | 322 timestamp1_ = value; |
| 312 } | 323 } |
| 313 | 324 |
| 325 void set_thread_timestamp0(int64_t value) { |
| 326 ASSERT(thread_timestamp0_ == -1); |
| 327 thread_timestamp0_ = value; |
| 328 } |
| 329 |
| 330 void set_thread_timestamp1(int64_t value) { |
| 331 ASSERT(thread_timestamp1_ == -1); |
| 332 thread_timestamp1_ = value; |
| 333 } |
| 334 |
| 314 bool pre_serialized_json() const { | 335 bool pre_serialized_json() const { |
| 315 return PreSerializedJSON::decode(state_); | 336 return PreSerializedJSON::decode(state_); |
| 316 } | 337 } |
| 317 | 338 |
| 318 void set_pre_serialized_json(bool pre_serialized_json) { | 339 void set_pre_serialized_json(bool pre_serialized_json) { |
| 319 state_ = PreSerializedJSON::update(pre_serialized_json, state_); | 340 state_ = PreSerializedJSON::update(pre_serialized_json, state_); |
| 320 } | 341 } |
| 321 | 342 |
| 322 bool owns_label() const { | 343 bool owns_label() const { |
| 323 return OwnsLabelBit::decode(state_); | 344 return OwnsLabelBit::decode(state_); |
| 324 } | 345 } |
| 325 | 346 |
| 326 enum StateBits { | 347 enum StateBits { |
| 327 kEventTypeBit = 0, // reserve 4 bits for type. | 348 kEventTypeBit = 0, // reserve 4 bits for type. |
| 328 kPreSerializedJSON = 4, | 349 kPreSerializedJSON = 4, |
| 329 kOwnsLabelBit = 5, | 350 kOwnsLabelBit = 5, |
| 330 kNextBit = 6, | 351 kNextBit = 6, |
| 331 }; | 352 }; |
| 332 | 353 |
| 333 class EventTypeField : public BitField<uword, EventType, kEventTypeBit, 4> {}; | 354 class EventTypeField : public BitField<uword, EventType, kEventTypeBit, 4> {}; |
| 334 class PreSerializedJSON : | 355 class PreSerializedJSON : |
| 335 public BitField<uword, bool, kPreSerializedJSON, 1> {}; | 356 public BitField<uword, bool, kPreSerializedJSON, 1> {}; |
| 336 class OwnsLabelBit : public BitField<uword, bool, kOwnsLabelBit, 1> {}; | 357 class OwnsLabelBit : public BitField<uword, bool, kOwnsLabelBit, 1> {}; |
| 337 | 358 |
| 338 int64_t timestamp0_; | 359 int64_t timestamp0_; |
| 339 int64_t timestamp1_; | 360 int64_t timestamp1_; |
| 361 int64_t thread_timestamp0_; |
| 362 int64_t thread_timestamp1_; |
| 340 TimelineEventArgument* arguments_; | 363 TimelineEventArgument* arguments_; |
| 341 intptr_t arguments_length_; | 364 intptr_t arguments_length_; |
| 342 uword state_; | 365 uword state_; |
| 343 const char* label_; | 366 const char* label_; |
| 344 const char* category_; | 367 const char* category_; |
| 345 ThreadId thread_; | 368 ThreadId thread_; |
| 346 Dart_Port isolate_id_; | 369 Dart_Port isolate_id_; |
| 347 | 370 |
| 348 friend class TimelineEventRecorder; | 371 friend class TimelineEventRecorder; |
| 349 friend class TimelineEventEndlessRecorder; | 372 friend class TimelineEventEndlessRecorder; |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 479 const char* label); | 502 const char* label); |
| 480 | 503 |
| 481 TimelineDurationScope(Thread* thread, | 504 TimelineDurationScope(Thread* thread, |
| 482 TimelineStream* stream, | 505 TimelineStream* stream, |
| 483 const char* label); | 506 const char* label); |
| 484 | 507 |
| 485 ~TimelineDurationScope(); | 508 ~TimelineDurationScope(); |
| 486 | 509 |
| 487 private: | 510 private: |
| 488 int64_t timestamp_; | 511 int64_t timestamp_; |
| 512 int64_t thread_timestamp_; |
| 489 | 513 |
| 490 DISALLOW_COPY_AND_ASSIGN(TimelineDurationScope); | 514 DISALLOW_COPY_AND_ASSIGN(TimelineDurationScope); |
| 491 }; | 515 }; |
| 492 | 516 |
| 493 | 517 |
| 494 class TimelineBeginEndScope : public TimelineEventScope { | 518 class TimelineBeginEndScope : public TimelineEventScope { |
| 495 public: | 519 public: |
| 496 TimelineBeginEndScope(TimelineStream* stream, | 520 TimelineBeginEndScope(TimelineStream* stream, |
| 497 const char* label); | 521 const char* label); |
| 498 | 522 |
| (...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 848 | 872 |
| 849 private: | 873 private: |
| 850 TimelineEventBlock* current_; | 874 TimelineEventBlock* current_; |
| 851 TimelineEventRecorder* recorder_; | 875 TimelineEventRecorder* recorder_; |
| 852 }; | 876 }; |
| 853 | 877 |
| 854 | 878 |
| 855 } // namespace dart | 879 } // namespace dart |
| 856 | 880 |
| 857 #endif // VM_TIMELINE_H_ | 881 #endif // VM_TIMELINE_H_ |
| OLD | NEW |