OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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_PROFILER_H_ | 5 #ifndef VM_PROFILER_H_ |
6 #define VM_PROFILER_H_ | 6 #define VM_PROFILER_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/code_observers.h" | 10 #include "vm/code_observers.h" |
11 #include "vm/globals.h" | 11 #include "vm/globals.h" |
12 #include "vm/growable_array.h" | 12 #include "vm/growable_array.h" |
13 #include "vm/object.h" | 13 #include "vm/object.h" |
14 #include "vm/tags.h" | 14 #include "vm/tags.h" |
15 #include "vm/thread_interrupter.h" | 15 #include "vm/thread_interrupter.h" |
16 | 16 |
17 // Profiler sampling and stack walking support. | 17 // Profiler sampling and stack walking support. |
18 // NOTE: For service related code, see profile_service.h. | 18 // NOTE: For service related code, see profile_service.h. |
19 | 19 |
20 namespace dart { | 20 namespace dart { |
21 | 21 |
22 // Forward declarations. | 22 // Forward declarations. |
23 class ProcessedSample; | 23 class ProcessedSample; |
24 class ProcessedSampleBuffer; | 24 class ProcessedSampleBuffer; |
25 | 25 |
26 class Sample; | 26 class Sample; |
27 class SampleBuffer; | 27 class SampleBuffer; |
| 28 class ProfileTrieNode; |
28 | 29 |
29 class Profiler : public AllStatic { | 30 class Profiler : public AllStatic { |
30 public: | 31 public: |
31 static void InitOnce(); | 32 static void InitOnce(); |
32 static void Shutdown(); | 33 static void Shutdown(); |
33 | 34 |
34 static void SetSampleDepth(intptr_t depth); | 35 static void SetSampleDepth(intptr_t depth); |
35 static void SetSamplePeriod(intptr_t period); | 36 static void SetSamplePeriod(intptr_t period); |
36 | 37 |
37 static SampleBuffer* sample_buffer() { | 38 static SampleBuffer* sample_buffer() { |
(...skipping 488 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
526 uword At(intptr_t index) const { | 527 uword At(intptr_t index) const { |
527 ASSERT(index >= 0); | 528 ASSERT(index >= 0); |
528 ASSERT(index < length()); | 529 ASSERT(index < length()); |
529 return pcs_[index]; | 530 return pcs_[index]; |
530 } | 531 } |
531 | 532 |
532 // Timestamp sample was taken at. | 533 // Timestamp sample was taken at. |
533 int64_t timestamp() const { return timestamp_; } | 534 int64_t timestamp() const { return timestamp_; } |
534 void set_timestamp(int64_t timestamp) { timestamp_ = timestamp; } | 535 void set_timestamp(int64_t timestamp) { timestamp_ = timestamp; } |
535 | 536 |
| 537 ThreadId tid() const { return tid_; } |
| 538 void set_tid(ThreadId tid) { tid_ = tid; } |
| 539 |
536 // The VM tag. | 540 // The VM tag. |
537 uword vm_tag() const { return vm_tag_; } | 541 uword vm_tag() const { return vm_tag_; } |
538 void set_vm_tag(uword tag) { vm_tag_ = tag; } | 542 void set_vm_tag(uword tag) { vm_tag_ = tag; } |
539 | 543 |
540 // The user tag. | 544 // The user tag. |
541 uword user_tag() const { return user_tag_; } | 545 uword user_tag() const { return user_tag_; } |
542 void set_user_tag(uword tag) { user_tag_ = tag; } | 546 void set_user_tag(uword tag) { user_tag_ = tag; } |
543 | 547 |
544 // The class id if this is an allocation profile sample. -1 otherwise. | 548 // The class id if this is an allocation profile sample. -1 otherwise. |
545 intptr_t allocation_cid() const { return allocation_cid_; } | 549 intptr_t allocation_cid() const { return allocation_cid_; } |
546 void set_allocation_cid(intptr_t cid) { allocation_cid_ = cid; } | 550 void set_allocation_cid(intptr_t cid) { allocation_cid_ = cid; } |
547 | 551 |
548 bool IsAllocationSample() const { | 552 bool IsAllocationSample() const { |
549 return allocation_cid_ > 0; | 553 return allocation_cid_ > 0; |
550 } | 554 } |
551 | 555 |
552 // Was the stack trace truncated? | 556 // Was the stack trace truncated? |
553 bool truncated() const { return truncated_; } | 557 bool truncated() const { return truncated_; } |
554 void set_truncated(bool truncated) { truncated_ = truncated; } | 558 void set_truncated(bool truncated) { truncated_ = truncated; } |
555 | 559 |
556 // Was the first frame in the stack trace executing? | 560 // Was the first frame in the stack trace executing? |
557 bool first_frame_executing() const { return first_frame_executing_; } | 561 bool first_frame_executing() const { return first_frame_executing_; } |
558 void set_first_frame_executing(bool first_frame_executing) { | 562 void set_first_frame_executing(bool first_frame_executing) { |
559 first_frame_executing_ = first_frame_executing; | 563 first_frame_executing_ = first_frame_executing; |
560 } | 564 } |
561 | 565 |
| 566 ProfileTrieNode* timeline_trie() const { return timeline_trie_; } |
| 567 void set_timeline_trie(ProfileTrieNode* trie) { |
| 568 ASSERT(timeline_trie_ == NULL); |
| 569 timeline_trie_ = trie; |
| 570 } |
| 571 |
562 private: | 572 private: |
563 void FixupCaller(const CodeLookupTable& clt, | 573 void FixupCaller(const CodeLookupTable& clt, |
564 uword pc_marker, | 574 uword pc_marker, |
565 uword* stack_buffer); | 575 uword* stack_buffer); |
566 | 576 |
567 void CheckForMissingDartFrame(const CodeLookupTable& clt, | 577 void CheckForMissingDartFrame(const CodeLookupTable& clt, |
568 const CodeDescriptor* code, | 578 const CodeDescriptor* code, |
569 uword pc_marker, | 579 uword pc_marker, |
570 uword* stack_buffer); | 580 uword* stack_buffer); |
571 | 581 |
572 ZoneGrowableArray<uword> pcs_; | 582 ZoneGrowableArray<uword> pcs_; |
573 int64_t timestamp_; | 583 int64_t timestamp_; |
| 584 ThreadId tid_; |
574 uword vm_tag_; | 585 uword vm_tag_; |
575 uword user_tag_; | 586 uword user_tag_; |
576 intptr_t allocation_cid_; | 587 intptr_t allocation_cid_; |
577 bool truncated_; | 588 bool truncated_; |
578 bool first_frame_executing_; | 589 bool first_frame_executing_; |
| 590 ProfileTrieNode* timeline_trie_; |
579 | 591 |
580 friend class SampleBuffer; | 592 friend class SampleBuffer; |
581 DISALLOW_COPY_AND_ASSIGN(ProcessedSample); | 593 DISALLOW_COPY_AND_ASSIGN(ProcessedSample); |
582 }; | 594 }; |
583 | 595 |
584 | 596 |
585 // A collection of |ProcessedSample|s. | 597 // A collection of |ProcessedSample|s. |
586 class ProcessedSampleBuffer : public ZoneAllocated { | 598 class ProcessedSampleBuffer : public ZoneAllocated { |
587 public: | 599 public: |
588 ProcessedSampleBuffer(); | 600 ProcessedSampleBuffer(); |
(...skipping 17 matching lines...) Expand all Loading... |
606 private: | 618 private: |
607 ZoneGrowableArray<ProcessedSample*> samples_; | 619 ZoneGrowableArray<ProcessedSample*> samples_; |
608 CodeLookupTable* code_lookup_table_; | 620 CodeLookupTable* code_lookup_table_; |
609 | 621 |
610 DISALLOW_COPY_AND_ASSIGN(ProcessedSampleBuffer); | 622 DISALLOW_COPY_AND_ASSIGN(ProcessedSampleBuffer); |
611 }; | 623 }; |
612 | 624 |
613 } // namespace dart | 625 } // namespace dart |
614 | 626 |
615 #endif // VM_PROFILER_H_ | 627 #endif // VM_PROFILER_H_ |
OLD | NEW |