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

Side by Side Diff: src/heap/spaces.h

Issue 2094753002: [heap] Use PageIterator in HeapObjectIterator (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 5 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
« no previous file with comments | « src/heap/heap.cc ('k') | src/heap/spaces.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 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 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_SPACES_H_ 5 #ifndef V8_HEAP_SPACES_H_
6 #define V8_HEAP_SPACES_H_ 6 #define V8_HEAP_SPACES_H_
7 7
8 #include <list> 8 #include <list>
9 9
10 #include "src/allocation.h" 10 #include "src/allocation.h"
(...skipping 1554 matching lines...) Expand 10 before | Expand all | Expand 10 after
1565 // Interface for heap object iterator to be implemented by all object space 1565 // Interface for heap object iterator to be implemented by all object space
1566 // object iterators. 1566 // object iterators.
1567 // 1567 //
1568 // NOTE: The space specific object iterators also implements the own next() 1568 // NOTE: The space specific object iterators also implements the own next()
1569 // method which is used to avoid using virtual functions 1569 // method which is used to avoid using virtual functions
1570 // iterating a specific space. 1570 // iterating a specific space.
1571 1571
1572 class ObjectIterator : public Malloced { 1572 class ObjectIterator : public Malloced {
1573 public: 1573 public:
1574 virtual ~ObjectIterator() {} 1574 virtual ~ObjectIterator() {}
1575 1575 virtual HeapObject* Next() = 0;
1576 virtual HeapObject* next_object() = 0;
1577 }; 1576 };
1578 1577
1578 template <class PAGE_TYPE>
1579 class PageIteratorImpl
Michael Lippautz 2016/06/23 19:43:14 Just moved up.
1580 : public std::iterator<std::forward_iterator_tag, PAGE_TYPE> {
brucedawson 2017/06/14 22:07:13 It turns out that std::iterator is deprecated in C
1581 public:
1582 explicit PageIteratorImpl(PAGE_TYPE* p) : p_(p) {}
1583 PageIteratorImpl(const PageIteratorImpl<PAGE_TYPE>& other) : p_(other.p_) {}
1584 PAGE_TYPE* operator*() { return p_; }
1585 bool operator==(const PageIteratorImpl<PAGE_TYPE>& rhs) {
1586 return rhs.p_ == p_;
1587 }
1588 bool operator!=(const PageIteratorImpl<PAGE_TYPE>& rhs) {
1589 return rhs.p_ != p_;
1590 }
1591 inline PageIteratorImpl<PAGE_TYPE>& operator++();
1592 inline PageIteratorImpl<PAGE_TYPE> operator++(int);
1593
1594 private:
1595 PAGE_TYPE* p_;
1596 };
1597
1598 typedef PageIteratorImpl<Page> PageIterator;
1599 typedef PageIteratorImpl<LargePage> LargePageIterator;
1600
1601 class PageRange {
1602 public:
1603 typedef PageIterator iterator;
1604 PageRange(Page* begin, Page* end) : begin_(begin), end_(end) {}
1605 explicit PageRange(Page* page) : PageRange(page, page->next_page()) {}
1606 iterator begin() { return iterator(begin_); }
1607 iterator end() { return iterator(end_); }
1608
1609 private:
1610 Page* begin_;
1611 Page* end_;
1612 };
1579 1613
1580 // ----------------------------------------------------------------------------- 1614 // -----------------------------------------------------------------------------
1581 // Heap object iterator in new/old/map spaces. 1615 // Heap object iterator in new/old/map spaces.
1582 // 1616 //
1583 // A HeapObjectIterator iterates objects from the bottom of the given space 1617 // A HeapObjectIterator iterates objects from the bottom of the given space
1584 // to its top or from the bottom of the given page to its top. 1618 // to its top or from the bottom of the given page to its top.
1585 // 1619 //
1586 // If objects are allocated in the page during iteration the iterator may 1620 // If objects are allocated in the page during iteration the iterator may
1587 // or may not iterate over those objects. The caller must create a new 1621 // or may not iterate over those objects. The caller must create a new
1588 // iterator in order to be sure to visit these new objects. 1622 // iterator in order to be sure to visit these new objects.
1589 class HeapObjectIterator : public ObjectIterator { 1623 class HeapObjectIterator : public ObjectIterator {
1590 public: 1624 public:
1591 // Creates a new object iterator in a given space. 1625 // Creates a new object iterator in a given space.
1592 explicit HeapObjectIterator(PagedSpace* space); 1626 explicit HeapObjectIterator(PagedSpace* space);
1593 explicit HeapObjectIterator(Page* page); 1627 explicit HeapObjectIterator(Page* page);
1594 1628
1595 // Advance to the next object, skipping free spaces and other fillers and 1629 // Advance to the next object, skipping free spaces and other fillers and
1596 // skipping the special garbage section of which there is one per space. 1630 // skipping the special garbage section of which there is one per space.
1597 // Returns NULL when the iteration has ended. 1631 // Returns nullptr when the iteration has ended.
1598 inline HeapObject* Next(); 1632 inline HeapObject* Next() override;
1599 inline HeapObject* next_object() override;
1600 1633
1601 private: 1634 private:
1602 enum PageMode { kOnePageOnly, kAllPagesInSpace };
1603
1604 Address cur_addr_; // Current iteration point.
1605 Address cur_end_; // End iteration point.
1606 PagedSpace* space_;
1607 PageMode page_mode_;
1608
1609 // Fast (inlined) path of next(). 1635 // Fast (inlined) path of next().
1610 inline HeapObject* FromCurrentPage(); 1636 inline HeapObject* FromCurrentPage();
1611 1637
1612 // Slow path of next(), goes into the next page. Returns false if the 1638 // Slow path of next(), goes into the next page. Returns false if the
1613 // iteration has ended. 1639 // iteration has ended.
1614 bool AdvanceToNextPage(); 1640 bool AdvanceToNextPage();
1615 1641
1616 // Initializes fields. 1642 Address cur_addr_; // Current iteration point.
1617 inline void Initialize(PagedSpace* owner, Address start, Address end, 1643 Address cur_end_; // End iteration point.
1618 PageMode mode); 1644 PagedSpace* space_;
1645 PageRange page_range_;
1646 PageRange::iterator current_page_;
1619 }; 1647 };
1620 1648
1621 1649
1622 // ----------------------------------------------------------------------------- 1650 // -----------------------------------------------------------------------------
1623 // A space has a circular list of pages. The next page can be accessed via 1651 // A space has a circular list of pages. The next page can be accessed via
1624 // Page::next_page() call. 1652 // Page::next_page() call.
1625 1653
1626 // An abstraction of allocation and relocation pointers in a page-structured 1654 // An abstraction of allocation and relocation pointers in a page-structured
1627 // space. 1655 // space.
1628 class AllocationInfo { 1656 class AllocationInfo {
(...skipping 431 matching lines...) Expand 10 before | Expand all | Expand 10 after
2060 2088
2061 private: 2089 private:
2062 LocalAllocationBuffer(Heap* heap, AllocationInfo allocation_info); 2090 LocalAllocationBuffer(Heap* heap, AllocationInfo allocation_info);
2063 2091
2064 void Close(); 2092 void Close();
2065 2093
2066 Heap* heap_; 2094 Heap* heap_;
2067 AllocationInfo allocation_info_; 2095 AllocationInfo allocation_info_;
2068 }; 2096 };
2069 2097
2070 template <class PAGE_TYPE> 2098 class NewSpacePageRange {
2071 class PageIteratorImpl
2072 : public std::iterator<std::forward_iterator_tag, PAGE_TYPE> {
2073 public: 2099 public:
2074 explicit PageIteratorImpl(PAGE_TYPE* p) : p_(p) {} 2100 typedef PageRange::iterator iterator;
2075 PageIteratorImpl(const PageIteratorImpl<PAGE_TYPE>& other) : p_(other.p_) {} 2101 inline NewSpacePageRange(Address start, Address limit);
2076 PAGE_TYPE* operator*() { return p_; } 2102 iterator begin() { return range_.begin(); }
2077 bool operator==(const PageIteratorImpl<PAGE_TYPE>& rhs) { 2103 iterator end() { return range_.end(); }
2078 return rhs.p_ == p_;
2079 }
2080 bool operator!=(const PageIteratorImpl<PAGE_TYPE>& rhs) {
2081 return rhs.p_ != p_;
2082 }
2083 inline PageIteratorImpl<PAGE_TYPE>& operator++();
2084 inline PageIteratorImpl<PAGE_TYPE> operator++(int);
2085 2104
2086 private: 2105 private:
2087 PAGE_TYPE* p_; 2106 PageRange range_;
2088 };
2089
2090 typedef PageIteratorImpl<Page> PageIterator;
2091 typedef PageIteratorImpl<LargePage> LargePageIterator;
2092
2093 class NewSpacePageRange {
2094 public:
2095 typedef PageIterator iterator;
2096
2097 inline NewSpacePageRange(Address start, Address limit);
2098
2099 iterator begin() { return iterator(Page::FromAddress(start_)); }
2100 iterator end() {
2101 return iterator(Page::FromAllocationAreaAddress(limit_)->next_page());
2102 }
2103
2104 private:
2105 Address start_;
2106 Address limit_;
2107 }; 2107 };
2108 2108
2109 class PagedSpace : public Space { 2109 class PagedSpace : public Space {
2110 public: 2110 public:
2111 typedef PageIterator iterator; 2111 typedef PageIterator iterator;
2112 2112
2113 static const intptr_t kCompactionMemoryWanted = 500 * KB; 2113 static const intptr_t kCompactionMemoryWanted = 500 * KB;
2114 2114
2115 // Creates a space with an id. 2115 // Creates a space with an id.
2116 PagedSpace(Heap* heap, AllocationSpace id, Executability executable); 2116 PagedSpace(Heap* heap, AllocationSpace id, Executability executable);
(...skipping 474 matching lines...) Expand 10 before | Expand all | Expand 10 after
2591 // A SemiSpaceIterator is an ObjectIterator that iterates over the active 2591 // A SemiSpaceIterator is an ObjectIterator that iterates over the active
2592 // semispace of the heap's new space. It iterates over the objects in the 2592 // semispace of the heap's new space. It iterates over the objects in the
2593 // semispace from a given start address (defaulting to the bottom of the 2593 // semispace from a given start address (defaulting to the bottom of the
2594 // semispace) to the top of the semispace. New objects allocated after the 2594 // semispace) to the top of the semispace. New objects allocated after the
2595 // iterator is created are not iterated. 2595 // iterator is created are not iterated.
2596 class SemiSpaceIterator : public ObjectIterator { 2596 class SemiSpaceIterator : public ObjectIterator {
2597 public: 2597 public:
2598 // Create an iterator over the allocated objects in the given to-space. 2598 // Create an iterator over the allocated objects in the given to-space.
2599 explicit SemiSpaceIterator(NewSpace* space); 2599 explicit SemiSpaceIterator(NewSpace* space);
2600 2600
2601 inline HeapObject* Next(); 2601 inline HeapObject* Next() override;
2602
2603 // Implementation of the ObjectIterator functions.
2604 inline HeapObject* next_object() override;
2605 2602
2606 private: 2603 private:
2607 void Initialize(Address start, Address end); 2604 void Initialize(Address start, Address end);
2608 2605
2609 // The current iteration point. 2606 // The current iteration point.
2610 Address current_; 2607 Address current_;
2611 // The end of iteration. 2608 // The end of iteration.
2612 Address limit_; 2609 Address limit_;
2613 }; 2610 };
2614 2611
(...skipping 501 matching lines...) Expand 10 before | Expand all | Expand 10 after
3116 base::HashMap chunk_map_; 3113 base::HashMap chunk_map_;
3117 3114
3118 friend class LargeObjectIterator; 3115 friend class LargeObjectIterator;
3119 }; 3116 };
3120 3117
3121 3118
3122 class LargeObjectIterator : public ObjectIterator { 3119 class LargeObjectIterator : public ObjectIterator {
3123 public: 3120 public:
3124 explicit LargeObjectIterator(LargeObjectSpace* space); 3121 explicit LargeObjectIterator(LargeObjectSpace* space);
3125 3122
3126 HeapObject* Next(); 3123 HeapObject* Next() override;
3127
3128 // implementation of ObjectIterator.
3129 virtual HeapObject* next_object() { return Next(); }
3130 3124
3131 private: 3125 private:
3132 LargePage* current_; 3126 LargePage* current_;
3133 }; 3127 };
3134 3128
3135 // Iterates over the chunks (pages and large object pages) that can contain 3129 // Iterates over the chunks (pages and large object pages) that can contain
3136 // pointers to new space or to evacuation candidates. 3130 // pointers to new space or to evacuation candidates.
3137 class MemoryChunkIterator BASE_EMBEDDED { 3131 class MemoryChunkIterator BASE_EMBEDDED {
3138 public: 3132 public:
3139 inline explicit MemoryChunkIterator(Heap* heap); 3133 inline explicit MemoryChunkIterator(Heap* heap);
(...skipping 28 matching lines...) Expand all
3168 count = 0; 3162 count = 0;
3169 } 3163 }
3170 // Must be small, since an iteration is used for lookup. 3164 // Must be small, since an iteration is used for lookup.
3171 static const int kMaxComments = 64; 3165 static const int kMaxComments = 64;
3172 }; 3166 };
3173 #endif 3167 #endif
3174 } // namespace internal 3168 } // namespace internal
3175 } // namespace v8 3169 } // namespace v8
3176 3170
3177 #endif // V8_HEAP_SPACES_H_ 3171 #endif // V8_HEAP_SPACES_H_
OLDNEW
« no previous file with comments | « src/heap/heap.cc ('k') | src/heap/spaces.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698