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 "platform/globals.h" | 5 #include "platform/globals.h" |
6 #ifndef PRODUCT | 6 #ifndef PRODUCT |
7 | 7 |
8 #include <errno.h> | 8 #include <errno.h> |
9 #include <fcntl.h> | 9 #include <fcntl.h> |
10 #include <cstdlib> | 10 #include <cstdlib> |
(...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
452 set_thread_timestamp0(thread_micros); | 452 set_thread_timestamp0(thread_micros); |
453 } | 453 } |
454 | 454 |
455 | 455 |
456 void TimelineEvent::Counter(const char* label, int64_t micros) { | 456 void TimelineEvent::Counter(const char* label, int64_t micros) { |
457 Init(kCounter, label); | 457 Init(kCounter, label); |
458 set_timestamp0(micros); | 458 set_timestamp0(micros); |
459 } | 459 } |
460 | 460 |
461 | 461 |
| 462 void TimelineEvent::FlowBegin(const char* label, |
| 463 int64_t async_id, |
| 464 int64_t micros) { |
| 465 Init(kFlowBegin, label); |
| 466 set_timestamp0(micros); |
| 467 // Overload timestamp1_ with the async_id. |
| 468 set_timestamp1(async_id); |
| 469 } |
| 470 |
| 471 |
| 472 void TimelineEvent::FlowStep(const char* label, |
| 473 int64_t async_id, |
| 474 int64_t micros) { |
| 475 Init(kFlowStep, label); |
| 476 set_timestamp0(micros); |
| 477 // Overload timestamp1_ with the async_id. |
| 478 set_timestamp1(async_id); |
| 479 } |
| 480 |
| 481 |
| 482 void TimelineEvent::FlowEnd(const char* label, |
| 483 int64_t async_id, |
| 484 int64_t micros) { |
| 485 Init(kFlowEnd, label); |
| 486 set_timestamp0(micros); |
| 487 // Overload timestamp1_ with the async_id. |
| 488 set_timestamp1(async_id); |
| 489 } |
| 490 |
| 491 |
462 void TimelineEvent::Metadata(const char* label, int64_t micros) { | 492 void TimelineEvent::Metadata(const char* label, int64_t micros) { |
463 Init(kMetadata, label); | 493 Init(kMetadata, label); |
464 set_timestamp0(micros); | 494 set_timestamp0(micros); |
465 } | 495 } |
466 | 496 |
467 | 497 |
468 void TimelineEvent::CompleteWithPreSerializedJSON(const char* json) { | 498 void TimelineEvent::CompleteWithPreSerializedJSON(const char* json) { |
469 set_pre_serialized_json(true); | 499 set_pre_serialized_json(true); |
470 SetNumArguments(1); | 500 SetNumArguments(1); |
471 CopyArgument(0, "Dart", json); | 501 CopyArgument(0, "Dart", json); |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
555 } \ | 585 } \ |
556 } | 586 } |
557 | 587 |
558 FUCHSIA_EVENT_ARGS_LIST(EMIT_FUCHSIA_EVENT) | 588 FUCHSIA_EVENT_ARGS_LIST(EMIT_FUCHSIA_EVENT) |
559 #undef EMIT_FUCHSIA_EVENT | 589 #undef EMIT_FUCHSIA_EVENT |
560 | 590 |
561 #define FUCHSIA_EVENT_ID_ARGS_LIST(V) \ | 591 #define FUCHSIA_EVENT_ID_ARGS_LIST(V) \ |
562 V(Instant, TRACE_INSTANT, ::tracing::EventScope) \ | 592 V(Instant, TRACE_INSTANT, ::tracing::EventScope) \ |
563 V(AsyncBegin, TRACE_ASYNC_BEGIN, int64_t) \ | 593 V(AsyncBegin, TRACE_ASYNC_BEGIN, int64_t) \ |
564 V(AsyncEnd, TRACE_ASYNC_END, int64_t) \ | 594 V(AsyncEnd, TRACE_ASYNC_END, int64_t) \ |
565 V(AsyncInstant, TRACE_ASYNC_INSTANT, int64_t) | 595 V(AsyncInstant, TRACE_ASYNC_INSTANT, int64_t) \ |
| 596 V(FlowBegin, TRACE_FLOW_BEGIN, int64_t) \ |
| 597 V(FlowStep, TRACE_FLOW_STEP, int64_t) \ |
| 598 V(FlowEnd, TRACE_FLOW_END, int64_t) |
566 | 599 |
567 #define EMIT_FUCHSIA_EVENT(__name, __macro, __id_typ) \ | 600 #define EMIT_FUCHSIA_EVENT(__name, __macro, __id_typ) \ |
568 static void EmitFuchsia##__name##Event(const char* label, __id_typ id, \ | 601 static void EmitFuchsia##__name##Event(const char* label, __id_typ id, \ |
569 TimelineEventArgument* arguments, \ | 602 TimelineEventArgument* arguments, \ |
570 intptr_t arguments_length) { \ | 603 intptr_t arguments_length) { \ |
571 if (arguments_length == 0) { \ | 604 if (arguments_length == 0) { \ |
572 __macro("dart", label, id); \ | 605 __macro("dart", label, id); \ |
573 } else if (arguments_length == 1) { \ | 606 } else if (arguments_length == 1) { \ |
574 __macro("dart", label, id, arguments[0].name, \ | 607 __macro("dart", label, id, arguments[0].name, \ |
575 const_cast<const char*>(arguments[0].value)); \ | 608 const_cast<const char*>(arguments[0].value)); \ |
(...skipping 25 matching lines...) Expand all Loading... |
601 arguments_length_); | 634 arguments_length_); |
602 break; | 635 break; |
603 case kAsyncEnd: | 636 case kAsyncEnd: |
604 EmitFuchsiaAsyncEndEvent(label_, AsyncId(), arguments_, | 637 EmitFuchsiaAsyncEndEvent(label_, AsyncId(), arguments_, |
605 arguments_length_); | 638 arguments_length_); |
606 break; | 639 break; |
607 case kAsyncInstant: | 640 case kAsyncInstant: |
608 EmitFuchsiaAsyncInstantEvent(label_, AsyncId(), arguments_, | 641 EmitFuchsiaAsyncInstantEvent(label_, AsyncId(), arguments_, |
609 arguments_length_); | 642 arguments_length_); |
610 break; | 643 break; |
| 644 case kFlowBegin: |
| 645 EmitFuchsiaFlowBeginEvent(label_, AsyncId(), arguments_, |
| 646 arguments_length_); |
| 647 break; |
| 648 case kFlowStep: |
| 649 EmitFuchsiaFlowStepEvent(label_, AsyncId(), arguments_, |
| 650 arguments_length_); |
| 651 break; |
| 652 case kFlowEnd: |
| 653 EmitFuchsiaFlowEndEvent(label_, AsyncId(), arguments_, arguments_length_); |
| 654 break; |
611 default: | 655 default: |
612 // TODO(zra): Figure out what to do with kDuration, kCounter, and | 656 // TODO(zra): Figure out what to do with kDuration, kCounter, and |
613 // kMetadata. | 657 // kMetadata. |
614 break; | 658 break; |
615 } | 659 } |
616 } | 660 } |
617 #endif | 661 #endif |
618 | 662 |
619 | 663 |
620 intptr_t TimelineEvent::PrintSystrace(char* buffer, intptr_t buffer_size) { | 664 intptr_t TimelineEvent::PrintSystrace(char* buffer, intptr_t buffer_size) { |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
773 obj.AddPropertyF("id", "%" Px64 "", AsyncId()); | 817 obj.AddPropertyF("id", "%" Px64 "", AsyncId()); |
774 } break; | 818 } break; |
775 case kAsyncInstant: { | 819 case kAsyncInstant: { |
776 obj.AddProperty("ph", "n"); | 820 obj.AddProperty("ph", "n"); |
777 obj.AddPropertyF("id", "%" Px64 "", AsyncId()); | 821 obj.AddPropertyF("id", "%" Px64 "", AsyncId()); |
778 } break; | 822 } break; |
779 case kAsyncEnd: { | 823 case kAsyncEnd: { |
780 obj.AddProperty("ph", "e"); | 824 obj.AddProperty("ph", "e"); |
781 obj.AddPropertyF("id", "%" Px64 "", AsyncId()); | 825 obj.AddPropertyF("id", "%" Px64 "", AsyncId()); |
782 } break; | 826 } break; |
| 827 case kCounter: { |
| 828 obj.AddProperty("ph", "C"); |
| 829 } break; |
| 830 case kFlowBegin: { |
| 831 obj.AddProperty("ph", "s"); |
| 832 obj.AddPropertyF("id", "%" Px64 "", AsyncId()); |
| 833 } break; |
| 834 case kFlowStep: { |
| 835 obj.AddProperty("ph", "t"); |
| 836 obj.AddPropertyF("id", "%" Px64 "", AsyncId()); |
| 837 } break; |
| 838 case kFlowEnd: { |
| 839 obj.AddProperty("ph", "f"); |
| 840 obj.AddProperty("bp", "e"); |
| 841 obj.AddPropertyF("id", "%" Px64 "", AsyncId()); |
| 842 } break; |
783 case kMetadata: { | 843 case kMetadata: { |
784 obj.AddProperty("ph", "M"); | 844 obj.AddProperty("ph", "M"); |
785 } break; | 845 } break; |
786 case kCounter: { | |
787 obj.AddProperty("ph", "C"); | |
788 } break; | |
789 default: | 846 default: |
790 UNIMPLEMENTED(); | 847 UNIMPLEMENTED(); |
791 } | 848 } |
792 { | 849 { |
793 JSONObject args(&obj, "args"); | 850 JSONObject args(&obj, "args"); |
794 for (intptr_t i = 0; i < arguments_length_; i++) { | 851 for (intptr_t i = 0; i < arguments_length_; i++) { |
795 const TimelineEventArgument& arg = arguments_[i]; | 852 const TimelineEventArgument& arg = arguments_[i]; |
796 args.AddProperty(arg.name, arg.value); | 853 args.AddProperty(arg.name, arg.value); |
797 } | 854 } |
798 if (isolate_id_ != ILLEGAL_PORT) { | 855 if (isolate_id_ != ILLEGAL_PORT) { |
(...skipping 522 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1321 // Free the stolen output. | 1378 // Free the stolen output. |
1322 free(output); | 1379 free(output); |
1323 (*file_close)(file); | 1380 (*file_close)(file); |
1324 | 1381 |
1325 return; | 1382 return; |
1326 } | 1383 } |
1327 | 1384 |
1328 | 1385 |
1329 int64_t TimelineEventRecorder::GetNextAsyncId() { | 1386 int64_t TimelineEventRecorder::GetNextAsyncId() { |
1330 // TODO(johnmccutchan): Gracefully handle wrap around. | 1387 // TODO(johnmccutchan): Gracefully handle wrap around. |
| 1388 // TODO(rmacnak): Use TRACE_NONCE() on Fuchsia? |
1331 uint32_t next = | 1389 uint32_t next = |
1332 static_cast<uint32_t>(AtomicOperations::FetchAndIncrement(&async_id_)); | 1390 static_cast<uint32_t>(AtomicOperations::FetchAndIncrement(&async_id_)); |
1333 return static_cast<int64_t>(next); | 1391 return static_cast<int64_t>(next); |
1334 } | 1392 } |
1335 | 1393 |
1336 | 1394 |
1337 void TimelineEventRecorder::FinishBlock(TimelineEventBlock* block) { | 1395 void TimelineEventRecorder::FinishBlock(TimelineEventBlock* block) { |
1338 if (block == NULL) { | 1396 if (block == NULL) { |
1339 return; | 1397 return; |
1340 } | 1398 } |
(...skipping 574 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1915 TimelineEventBlock* TimelineEventBlockIterator::Next() { | 1973 TimelineEventBlock* TimelineEventBlockIterator::Next() { |
1916 ASSERT(current_ != NULL); | 1974 ASSERT(current_ != NULL); |
1917 TimelineEventBlock* r = current_; | 1975 TimelineEventBlock* r = current_; |
1918 current_ = current_->next(); | 1976 current_ = current_->next(); |
1919 return r; | 1977 return r; |
1920 } | 1978 } |
1921 | 1979 |
1922 } // namespace dart | 1980 } // namespace dart |
1923 | 1981 |
1924 #endif // !PRODUCT | 1982 #endif // !PRODUCT |
OLD | NEW |