| 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 <cstdlib> | 5 #include <cstdlib> |
| 6 | 6 |
| 7 #include "vm/atomic.h" | 7 #include "vm/atomic.h" |
| 8 #include "vm/isolate.h" | 8 #include "vm/isolate.h" |
| 9 #include "vm/json_stream.h" | 9 #include "vm/json_stream.h" |
| 10 #include "vm/lockers.h" | 10 #include "vm/lockers.h" |
| (...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 301 | 301 |
| 302 #define TIMELINE_STREAM_DEFINE(name, enabled_by_default) \ | 302 #define TIMELINE_STREAM_DEFINE(name, enabled_by_default) \ |
| 303 bool Timeline::stream_##name##_enabled_ = enabled_by_default; \ | 303 bool Timeline::stream_##name##_enabled_ = enabled_by_default; \ |
| 304 TimelineStream Timeline::stream_##name##_; | 304 TimelineStream Timeline::stream_##name##_; |
| 305 TIMELINE_STREAM_LIST(TIMELINE_STREAM_DEFINE) | 305 TIMELINE_STREAM_LIST(TIMELINE_STREAM_DEFINE) |
| 306 #undef TIMELINE_STREAM_DEFINE | 306 #undef TIMELINE_STREAM_DEFINE |
| 307 | 307 |
| 308 TimelineEvent::TimelineEvent() | 308 TimelineEvent::TimelineEvent() |
| 309 : timestamp0_(0), | 309 : timestamp0_(0), |
| 310 timestamp1_(0), | 310 timestamp1_(0), |
| 311 thread_timestamp0_(-1), |
| 312 thread_timestamp1_(-1), |
| 311 arguments_(NULL), | 313 arguments_(NULL), |
| 312 arguments_length_(0), | 314 arguments_length_(0), |
| 313 state_(0), | 315 state_(0), |
| 314 label_(NULL), | 316 label_(NULL), |
| 315 category_(""), | 317 category_(""), |
| 316 thread_(OSThread::kInvalidThreadId), | 318 thread_(OSThread::kInvalidThreadId), |
| 317 isolate_id_(ILLEGAL_PORT) { | 319 isolate_id_(ILLEGAL_PORT) { |
| 318 } | 320 } |
| 319 | 321 |
| 320 | 322 |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 363 int64_t async_id, | 365 int64_t async_id, |
| 364 int64_t micros) { | 366 int64_t micros) { |
| 365 Init(kAsyncEnd, label); | 367 Init(kAsyncEnd, label); |
| 366 set_timestamp0(micros); | 368 set_timestamp0(micros); |
| 367 // Overload timestamp1_ with the async_id. | 369 // Overload timestamp1_ with the async_id. |
| 368 set_timestamp1(async_id); | 370 set_timestamp1(async_id); |
| 369 } | 371 } |
| 370 | 372 |
| 371 | 373 |
| 372 void TimelineEvent::DurationBegin(const char* label, | 374 void TimelineEvent::DurationBegin(const char* label, |
| 373 int64_t micros) { | 375 int64_t micros, |
| 376 int64_t thread_micros) { |
| 374 Init(kDuration, label); | 377 Init(kDuration, label); |
| 375 set_timestamp0(micros); | 378 set_timestamp0(micros); |
| 379 set_thread_timestamp0(thread_micros); |
| 376 } | 380 } |
| 377 | 381 |
| 378 | 382 |
| 379 void TimelineEvent::DurationEnd(int64_t micros) { | 383 void TimelineEvent::DurationEnd(int64_t micros, |
| 384 int64_t thread_micros) { |
| 380 ASSERT(timestamp1_ == 0); | 385 ASSERT(timestamp1_ == 0); |
| 381 set_timestamp1(micros); | 386 set_timestamp1(micros); |
| 387 set_thread_timestamp1(thread_micros); |
| 382 } | 388 } |
| 383 | 389 |
| 384 | 390 |
| 385 void TimelineEvent::Instant(const char* label, | 391 void TimelineEvent::Instant(const char* label, |
| 386 int64_t micros) { | 392 int64_t micros) { |
| 387 Init(kInstant, label); | 393 Init(kInstant, label); |
| 388 set_timestamp0(micros); | 394 set_timestamp0(micros); |
| 389 } | 395 } |
| 390 | 396 |
| 391 | 397 |
| 392 void TimelineEvent::Duration(const char* label, | 398 void TimelineEvent::Duration(const char* label, |
| 393 int64_t start_micros, | 399 int64_t start_micros, |
| 394 int64_t end_micros) { | 400 int64_t end_micros, |
| 401 int64_t thread_start_micros, |
| 402 int64_t thread_end_micros) { |
| 395 Init(kDuration, label); | 403 Init(kDuration, label); |
| 396 set_timestamp0(start_micros); | 404 set_timestamp0(start_micros); |
| 397 set_timestamp1(end_micros); | 405 set_timestamp1(end_micros); |
| 406 set_thread_timestamp0(thread_start_micros); |
| 407 set_thread_timestamp1(thread_end_micros); |
| 398 } | 408 } |
| 399 | 409 |
| 400 | 410 |
| 401 void TimelineEvent::Begin(const char* label, | 411 void TimelineEvent::Begin(const char* label, |
| 402 int64_t micros) { | 412 int64_t micros, |
| 413 int64_t thread_micros) { |
| 403 Init(kBegin, label); | 414 Init(kBegin, label); |
| 404 set_timestamp0(micros); | 415 set_timestamp0(micros); |
| 416 set_thread_timestamp0(thread_micros); |
| 405 } | 417 } |
| 406 | 418 |
| 407 | 419 |
| 408 void TimelineEvent::End(const char* label, | 420 void TimelineEvent::End(const char* label, |
| 409 int64_t micros) { | 421 int64_t micros, |
| 422 int64_t thread_micros) { |
| 410 Init(kEnd, label); | 423 Init(kEnd, label); |
| 411 set_timestamp0(micros); | 424 set_timestamp0(micros); |
| 425 set_thread_timestamp0(thread_micros); |
| 412 } | 426 } |
| 413 | 427 |
| 414 | 428 |
| 415 void TimelineEvent::Counter(const char* label, int64_t micros) { | 429 void TimelineEvent::Counter(const char* label, int64_t micros) { |
| 416 Init(kCounter, label); | 430 Init(kCounter, label); |
| 417 set_timestamp0(micros); | 431 set_timestamp0(micros); |
| 418 } | 432 } |
| 419 | 433 |
| 420 | 434 |
| 421 void TimelineEvent::Metadata(const char* label, int64_t micros) { | 435 void TimelineEvent::Metadata(const char* label, int64_t micros) { |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 515 } | 529 } |
| 516 } | 530 } |
| 517 | 531 |
| 518 | 532 |
| 519 void TimelineEvent::Init(EventType event_type, | 533 void TimelineEvent::Init(EventType event_type, |
| 520 const char* label) { | 534 const char* label) { |
| 521 ASSERT(label != NULL); | 535 ASSERT(label != NULL); |
| 522 state_ = 0; | 536 state_ = 0; |
| 523 timestamp0_ = 0; | 537 timestamp0_ = 0; |
| 524 timestamp1_ = 0; | 538 timestamp1_ = 0; |
| 539 thread_timestamp0_ = -1; |
| 540 thread_timestamp1_ = -1; |
| 525 OSThread* os_thread = OSThread::Current(); | 541 OSThread* os_thread = OSThread::Current(); |
| 526 ASSERT(os_thread != NULL); | 542 ASSERT(os_thread != NULL); |
| 527 thread_ = os_thread->trace_id(); | 543 thread_ = os_thread->trace_id(); |
| 528 Isolate* isolate = Isolate::Current(); | 544 Isolate* isolate = Isolate::Current(); |
| 529 if (isolate != NULL) { | 545 if (isolate != NULL) { |
| 530 isolate_id_ = isolate->main_port(); | 546 isolate_id_ = isolate->main_port(); |
| 531 } else { | 547 } else { |
| 532 isolate_id_ = ILLEGAL_PORT; | 548 isolate_id_ = ILLEGAL_PORT; |
| 533 } | 549 } |
| 534 label_ = label; | 550 label_ = label; |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 581 return; | 597 return; |
| 582 } | 598 } |
| 583 JSONObject obj(stream); | 599 JSONObject obj(stream); |
| 584 int64_t pid = OS::ProcessId(); | 600 int64_t pid = OS::ProcessId(); |
| 585 int64_t tid = OSThread::ThreadIdToIntPtr(thread_); | 601 int64_t tid = OSThread::ThreadIdToIntPtr(thread_); |
| 586 obj.AddProperty("name", label_); | 602 obj.AddProperty("name", label_); |
| 587 obj.AddProperty("cat", category_); | 603 obj.AddProperty("cat", category_); |
| 588 obj.AddProperty64("tid", tid); | 604 obj.AddProperty64("tid", tid); |
| 589 obj.AddProperty64("pid", pid); | 605 obj.AddProperty64("pid", pid); |
| 590 obj.AddPropertyTimeMicros("ts", TimeOrigin()); | 606 obj.AddPropertyTimeMicros("ts", TimeOrigin()); |
| 591 | 607 if (HasThreadCPUTime()) { |
| 608 obj.AddPropertyTimeMicros("tts", ThreadCPUTimeOrigin()); |
| 609 } |
| 592 switch (event_type()) { | 610 switch (event_type()) { |
| 593 case kBegin: { | 611 case kBegin: { |
| 594 obj.AddProperty("ph", "B"); | 612 obj.AddProperty("ph", "B"); |
| 595 } | 613 } |
| 596 break; | 614 break; |
| 597 case kEnd: { | 615 case kEnd: { |
| 598 obj.AddProperty("ph", "E"); | 616 obj.AddProperty("ph", "E"); |
| 599 } | 617 } |
| 600 break; | 618 break; |
| 601 case kDuration: { | 619 case kDuration: { |
| 602 obj.AddProperty("ph", "X"); | 620 obj.AddProperty("ph", "X"); |
| 603 obj.AddPropertyTimeMicros("dur", TimeDuration()); | 621 obj.AddPropertyTimeMicros("dur", TimeDuration()); |
| 622 if (HasThreadCPUTime()) { |
| 623 obj.AddPropertyTimeMicros("tdur", ThreadCPUTimeDuration()); |
| 624 } |
| 604 } | 625 } |
| 605 break; | 626 break; |
| 606 case kInstant: { | 627 case kInstant: { |
| 607 obj.AddProperty("ph", "i"); | 628 obj.AddProperty("ph", "i"); |
| 608 obj.AddProperty("s", "p"); | 629 obj.AddProperty("s", "p"); |
| 609 } | 630 } |
| 610 break; | 631 break; |
| 611 case kAsyncBegin: { | 632 case kAsyncBegin: { |
| 612 obj.AddProperty("ph", "b"); | 633 obj.AddProperty("ph", "b"); |
| 613 obj.AddPropertyF("id", "%" Px64 "", AsyncId()); | 634 obj.AddPropertyF("id", "%" Px64 "", AsyncId()); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 661 | 682 |
| 662 int64_t TimelineEvent::TimeDuration() const { | 683 int64_t TimelineEvent::TimeDuration() const { |
| 663 if (timestamp1_ == 0) { | 684 if (timestamp1_ == 0) { |
| 664 // This duration is still open, use current time as end. | 685 // This duration is still open, use current time as end. |
| 665 return OS::GetCurrentMonotonicMicros() - timestamp0_; | 686 return OS::GetCurrentMonotonicMicros() - timestamp0_; |
| 666 } | 687 } |
| 667 return timestamp1_ - timestamp0_; | 688 return timestamp1_ - timestamp0_; |
| 668 } | 689 } |
| 669 | 690 |
| 670 | 691 |
| 692 bool TimelineEvent::HasThreadCPUTime() const { |
| 693 return (thread_timestamp0_ != -1); |
| 694 } |
| 695 |
| 696 |
| 697 |
| 698 int64_t TimelineEvent::ThreadCPUTimeOrigin() const { |
| 699 ASSERT(HasThreadCPUTime()); |
| 700 return thread_timestamp0_; |
| 701 } |
| 702 |
| 703 |
| 704 int64_t TimelineEvent::ThreadCPUTimeDuration() const { |
| 705 ASSERT(HasThreadCPUTime()); |
| 706 if (thread_timestamp1_ == -1) { |
| 707 // This duration is still open, use current time as end. |
| 708 return OS::GetCurrentThreadCPUMicros() - thread_timestamp0_; |
| 709 } |
| 710 return thread_timestamp1_ - thread_timestamp0_; |
| 711 } |
| 712 |
| 713 |
| 671 TimelineStream::TimelineStream() | 714 TimelineStream::TimelineStream() |
| 672 : name_(NULL), | 715 : name_(NULL), |
| 673 enabled_(false), | 716 enabled_(false), |
| 674 globally_enabled_(NULL) { | 717 globally_enabled_(NULL) { |
| 675 } | 718 } |
| 676 | 719 |
| 677 | 720 |
| 678 void TimelineStream::Init(const char* name, | 721 void TimelineStream::Init(const char* name, |
| 679 bool enabled, | 722 bool enabled, |
| 680 const bool* globally_enabled) { | 723 const bool* globally_enabled) { |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 824 } | 867 } |
| 825 | 868 |
| 826 | 869 |
| 827 TimelineDurationScope::TimelineDurationScope(TimelineStream* stream, | 870 TimelineDurationScope::TimelineDurationScope(TimelineStream* stream, |
| 828 const char* label) | 871 const char* label) |
| 829 : TimelineEventScope(stream, label) { | 872 : TimelineEventScope(stream, label) { |
| 830 if (!FLAG_support_timeline) { | 873 if (!FLAG_support_timeline) { |
| 831 return; | 874 return; |
| 832 } | 875 } |
| 833 timestamp_ = OS::GetCurrentMonotonicMicros(); | 876 timestamp_ = OS::GetCurrentMonotonicMicros(); |
| 877 thread_timestamp_ = OS::GetCurrentThreadCPUMicros(); |
| 834 } | 878 } |
| 835 | 879 |
| 836 | 880 |
| 837 TimelineDurationScope::TimelineDurationScope(Thread* thread, | 881 TimelineDurationScope::TimelineDurationScope(Thread* thread, |
| 838 TimelineStream* stream, | 882 TimelineStream* stream, |
| 839 const char* label) | 883 const char* label) |
| 840 : TimelineEventScope(thread, stream, label) { | 884 : TimelineEventScope(thread, stream, label) { |
| 841 if (!FLAG_support_timeline) { | 885 if (!FLAG_support_timeline) { |
| 842 return; | 886 return; |
| 843 } | 887 } |
| 844 timestamp_ = OS::GetCurrentMonotonicMicros(); | 888 timestamp_ = OS::GetCurrentMonotonicMicros(); |
| 889 thread_timestamp_ = OS::GetCurrentThreadCPUMicros(); |
| 845 } | 890 } |
| 846 | 891 |
| 847 | 892 |
| 848 TimelineDurationScope::~TimelineDurationScope() { | 893 TimelineDurationScope::~TimelineDurationScope() { |
| 849 if (!FLAG_support_timeline) { | 894 if (!FLAG_support_timeline) { |
| 850 return; | 895 return; |
| 851 } | 896 } |
| 852 if (!ShouldEmitEvent()) { | 897 if (!ShouldEmitEvent()) { |
| 853 return; | 898 return; |
| 854 } | 899 } |
| 855 TimelineEvent* event = stream()->StartEvent(); | 900 TimelineEvent* event = stream()->StartEvent(); |
| 856 if (event == NULL) { | 901 if (event == NULL) { |
| 857 // Stream is now disabled. | 902 // Stream is now disabled. |
| 858 return; | 903 return; |
| 859 } | 904 } |
| 860 ASSERT(event != NULL); | 905 ASSERT(event != NULL); |
| 861 // Emit a duration event. | 906 // Emit a duration event. |
| 862 event->Duration(label(), timestamp_, OS::GetCurrentMonotonicMicros()); | 907 event->Duration(label(), |
| 908 timestamp_, |
| 909 OS::GetCurrentMonotonicMicros(), |
| 910 thread_timestamp_, |
| 911 OS::GetCurrentThreadCPUMicros()); |
| 863 StealArguments(event); | 912 StealArguments(event); |
| 864 event->Complete(); | 913 event->Complete(); |
| 865 } | 914 } |
| 866 | 915 |
| 867 | 916 |
| 868 TimelineBeginEndScope::TimelineBeginEndScope(TimelineStream* stream, | 917 TimelineBeginEndScope::TimelineBeginEndScope(TimelineStream* stream, |
| 869 const char* label) | 918 const char* label) |
| 870 : TimelineEventScope(stream, label) { | 919 : TimelineEventScope(stream, label) { |
| 871 if (!FLAG_support_timeline) { | 920 if (!FLAG_support_timeline) { |
| 872 return; | 921 return; |
| (...skipping 714 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1587 TimelineEventBlock* TimelineEventBlockIterator::Next() { | 1636 TimelineEventBlock* TimelineEventBlockIterator::Next() { |
| 1588 ASSERT(current_ != NULL); | 1637 ASSERT(current_ != NULL); |
| 1589 TimelineEventBlock* r = current_; | 1638 TimelineEventBlock* r = current_; |
| 1590 current_ = current_->next(); | 1639 current_ = current_->next(); |
| 1591 return r; | 1640 return r; |
| 1592 } | 1641 } |
| 1593 | 1642 |
| 1594 #endif // !PRODUCT | 1643 #endif // !PRODUCT |
| 1595 | 1644 |
| 1596 } // namespace dart | 1645 } // namespace dart |
| OLD | NEW |