Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(395)

Side by Side Diff: src/heap.h

Issue 416543003: Move GCTracer to separate files. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Updates Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/gc-tracer.cc ('k') | src/heap.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_HEAP_H_ 5 #ifndef V8_HEAP_H_
6 #define V8_HEAP_H_ 6 #define V8_HEAP_H_
7 7
8 #include <cmath> 8 #include <cmath>
9 9
10 #include "src/allocation.h" 10 #include "src/allocation.h"
11 #include "src/assert-scope.h" 11 #include "src/assert-scope.h"
12 #include "src/counters.h" 12 #include "src/counters.h"
13 #include "src/gc-tracer.h"
13 #include "src/globals.h" 14 #include "src/globals.h"
14 #include "src/incremental-marking.h" 15 #include "src/incremental-marking.h"
15 #include "src/list.h" 16 #include "src/list.h"
16 #include "src/mark-compact.h" 17 #include "src/mark-compact.h"
17 #include "src/objects-visiting.h" 18 #include "src/objects-visiting.h"
18 #include "src/spaces.h" 19 #include "src/spaces.h"
19 #include "src/splay-tree-inl.h" 20 #include "src/splay-tree-inl.h"
20 #include "src/store-buffer.h" 21 #include "src/store-buffer.h"
21 22
22 namespace v8 { 23 namespace v8 {
(...skipping 517 matching lines...) Expand 10 before | Expand all | Expand 10 after
540 541
541 DISALLOW_COPY_AND_ASSIGN(ExternalStringTable); 542 DISALLOW_COPY_AND_ASSIGN(ExternalStringTable);
542 }; 543 };
543 544
544 545
545 enum ArrayStorageAllocationMode { 546 enum ArrayStorageAllocationMode {
546 DONT_INITIALIZE_ARRAY_ELEMENTS, 547 DONT_INITIALIZE_ARRAY_ELEMENTS,
547 INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE 548 INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE
548 }; 549 };
549 550
550 // TODO(ernstm): Move into GCTracer.
551 // A simple ring buffer class with maximum size known at compile time.
552 // The class only implements the functionality required in GCTracer.
553 template <typename T, size_t MAX_SIZE>
554 class RingBuffer {
555 public:
556 class const_iterator {
557 public:
558 const_iterator() : index_(0), elements_(NULL) {}
559
560 const_iterator(size_t index, const T* elements)
561 : index_(index), elements_(elements) {}
562
563 bool operator==(const const_iterator& rhs) const {
564 return elements_ == rhs.elements_ && index_ == rhs.index_;
565 }
566
567 bool operator!=(const const_iterator& rhs) const {
568 return elements_ != rhs.elements_ || index_ != rhs.index_;
569 }
570
571 operator const T*() const { return elements_ + index_; }
572
573 const T* operator->() const { return elements_ + index_; }
574
575 const T& operator*() const { return elements_[index_]; }
576
577 const_iterator& operator++() {
578 index_ = (index_ + 1) % (MAX_SIZE + 1);
579 return *this;
580 }
581
582 const_iterator& operator--() {
583 index_ = (index_ + MAX_SIZE) % (MAX_SIZE + 1);
584 return *this;
585 }
586
587 private:
588 size_t index_;
589 const T* elements_;
590 };
591
592 RingBuffer() : begin_(0), end_(0) {}
593
594 bool empty() const { return begin_ == end_; }
595 size_t size() const {
596 return (end_ - begin_ + MAX_SIZE + 1) % (MAX_SIZE + 1);
597 }
598 const_iterator begin() const { return const_iterator(begin_, elements_); }
599 const_iterator end() const { return const_iterator(end_, elements_); }
600 const_iterator back() const { return --end(); }
601 void push_back(const T& element) {
602 elements_[end_] = element;
603 end_ = (end_ + 1) % (MAX_SIZE + 1);
604 if (end_ == begin_) begin_ = (begin_ + 1) % (MAX_SIZE + 1);
605 }
606 void push_front(const T& element) {
607 begin_ = (begin_ + MAX_SIZE) % (MAX_SIZE + 1);
608 if (begin_ == end_) end_ = (end_ + MAX_SIZE) % (MAX_SIZE + 1);
609 elements_[begin_] = element;
610 }
611
612 private:
613 T elements_[MAX_SIZE + 1];
614 size_t begin_;
615 size_t end_;
616
617 DISALLOW_COPY_AND_ASSIGN(RingBuffer);
618 };
619
620
621 // GCTracer collects and prints ONE line after each garbage collector
622 // invocation IFF --trace_gc is used.
623
624 // TODO(ernstm): Unit tests. Move to separate file.
625 class GCTracer BASE_EMBEDDED {
626 public:
627 class Scope BASE_EMBEDDED {
628 public:
629 enum ScopeId {
630 EXTERNAL,
631 MC_MARK,
632 MC_SWEEP,
633 MC_SWEEP_NEWSPACE,
634 MC_SWEEP_OLDSPACE,
635 MC_SWEEP_CODE,
636 MC_SWEEP_CELL,
637 MC_SWEEP_MAP,
638 MC_EVACUATE_PAGES,
639 MC_UPDATE_NEW_TO_NEW_POINTERS,
640 MC_UPDATE_ROOT_TO_NEW_POINTERS,
641 MC_UPDATE_OLD_TO_NEW_POINTERS,
642 MC_UPDATE_POINTERS_TO_EVACUATED,
643 MC_UPDATE_POINTERS_BETWEEN_EVACUATED,
644 MC_UPDATE_MISC_POINTERS,
645 MC_WEAKCOLLECTION_PROCESS,
646 MC_WEAKCOLLECTION_CLEAR,
647 MC_FLUSH_CODE,
648 NUMBER_OF_SCOPES
649 };
650
651 Scope(GCTracer* tracer, ScopeId scope)
652 : tracer_(tracer),
653 scope_(scope) {
654 start_time_ = base::OS::TimeCurrentMillis();
655 }
656
657 ~Scope() {
658 ASSERT(scope_ < NUMBER_OF_SCOPES); // scope_ is unsigned.
659 tracer_->current_.scopes[scope_] +=
660 base::OS::TimeCurrentMillis() - start_time_;
661 }
662
663 private:
664 GCTracer* tracer_;
665 ScopeId scope_;
666 double start_time_;
667
668 DISALLOW_COPY_AND_ASSIGN(Scope);
669 };
670
671
672 class Event {
673 public:
674 enum Type { SCAVENGER = 0, MARK_COMPACTOR = 1, START = 2 };
675
676 // Default constructor leaves the event uninitialized.
677 Event() {}
678
679 Event(Type type, const char* gc_reason, const char* collector_reason);
680
681 // Returns a string describing the event type.
682 const char* TypeName(bool short_name) const;
683
684 // Type of event
685 Type type;
686
687 const char* gc_reason;
688 const char* collector_reason;
689
690 // Timestamp set in the constructor.
691 double start_time;
692
693 // Timestamp set in the destructor.
694 double end_time;
695
696 // Size of objects in heap set in constructor.
697 intptr_t start_object_size;
698
699 // Size of objects in heap set in destructor.
700 intptr_t end_object_size;
701
702 // Size of memory allocated from OS set in constructor.
703 intptr_t start_memory_size;
704
705 // Size of memory allocated from OS set in destructor.
706 intptr_t end_memory_size;
707
708 // Total amount of space either wasted or contained in one of free lists
709 // before the current GC.
710 intptr_t start_holes_size;
711
712 // Total amount of space either wasted or contained in one of free lists
713 // after the current GC.
714 intptr_t end_holes_size;
715
716 // Number of incremental marking steps since creation of tracer.
717 // (value at start of event)
718 int incremental_marking_steps;
719
720 // Cumulative duration of incremental marking steps since creation of
721 // tracer. (value at start of event)
722 double incremental_marking_duration;
723
724 // Longest incremental marking step since start of marking.
725 // (value at start of event)
726 double longest_incremental_marking_step;
727
728 // Amounts of time spent in different scopes during GC.
729 double scopes[Scope::NUMBER_OF_SCOPES];
730 };
731
732 static const int kRingBufferMaxSize = 10;
733
734 typedef RingBuffer<Event, kRingBufferMaxSize> EventBuffer;
735
736 explicit GCTracer(Heap* heap);
737
738 // Start collecting data.
739 void Start(GarbageCollector collector, const char* gc_reason,
740 const char* collector_reason);
741
742 // Stop collecting data and print results.
743 void Stop();
744
745 // Log an incremental marking step.
746 void AddIncrementalMarkingStep(double duration);
747
748 private:
749 // Print one detailed trace line in name=value format.
750 // TODO(ernstm): Move to Heap.
751 void PrintNVP() const;
752
753 // Print one trace line.
754 // TODO(ernstm): Move to Heap.
755 void Print() const;
756
757 // Pointer to the heap that owns this tracer.
758 Heap* heap_;
759
760 // Current tracer event. Populated during Start/Stop cycle. Valid after Stop()
761 // has returned.
762 Event current_;
763
764 // Previous tracer event.
765 Event previous_;
766
767 // Previous MARK_COMPACTOR event.
768 Event previous_mark_compactor_event_;
769
770 // RingBuffers for SCAVENGER events.
771 EventBuffer scavenger_events_;
772
773 // RingBuffers for MARK_COMPACTOR events.
774 EventBuffer mark_compactor_events_;
775
776 // Cumulative number of incremental marking steps since creation of tracer.
777 int incremental_marking_steps_;
778
779 // Cumulative duration of incremental marking steps since creation of tracer.
780 double incremental_marking_duration_;
781
782 // Longest incremental marking step since start of marking.
783 double longest_incremental_marking_step_;
784
785 DISALLOW_COPY_AND_ASSIGN(GCTracer);
786 };
787
788 551
789 class Heap { 552 class Heap {
790 public: 553 public:
791 // Configure heap size in MB before setup. Return false if the heap has been 554 // Configure heap size in MB before setup. Return false if the heap has been
792 // set up already. 555 // set up already.
793 bool ConfigureHeap(int max_semi_space_size, 556 bool ConfigureHeap(int max_semi_space_size,
794 int max_old_space_size, 557 int max_old_space_size,
795 int max_executable_size, 558 int max_executable_size,
796 size_t code_range_size); 559 size_t code_range_size);
797 bool ConfigureHeapDefault(); 560 bool ConfigureHeapDefault();
(...skipping 2096 matching lines...) Expand 10 before | Expand all | Expand 10 after
2894 DisallowHeapAllocation no_allocation; // i.e. no gc allowed. 2657 DisallowHeapAllocation no_allocation; // i.e. no gc allowed.
2895 2658
2896 private: 2659 private:
2897 DISALLOW_IMPLICIT_CONSTRUCTORS(PathTracer); 2660 DISALLOW_IMPLICIT_CONSTRUCTORS(PathTracer);
2898 }; 2661 };
2899 #endif // DEBUG 2662 #endif // DEBUG
2900 2663
2901 } } // namespace v8::internal 2664 } } // namespace v8::internal
2902 2665
2903 #endif // V8_HEAP_H_ 2666 #endif // V8_HEAP_H_
OLDNEW
« no previous file with comments | « src/gc-tracer.cc ('k') | src/heap.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698