< prev index next >

src/hotspot/share/gc/g1/heapRegionSet.hpp

Print this page
rev 56821 : imported patch 8220310.mut.0
rev 56822 : imported patch 8220310.mut.1
rev 56834 : imported patch 8220312.stat.2
rev 56836 : imported patch 8220312.stat.4
rev 56838 : [mq]: 8220312.stat.5

*** 134,169 **** // sorted list. We should try to avoid doing operations that iterate over // such lists in performance critical paths. Typically we should // add / remove one region at a time or concatenate two lists. class FreeRegionListIterator; class FreeRegionList : public HeapRegionSetBase { friend class FreeRegionListIterator; private: HeapRegion* _head; HeapRegion* _tail; // _last is used to keep track of where we added an element the last // time. It helps to improve performance when adding several ordered items in a row. HeapRegion* _last; static uint _unrealistically_long_length; inline HeapRegion* remove_from_head_impl(); inline HeapRegion* remove_from_tail_impl(); protected: // See the comment for HeapRegionSetBase::clear() virtual void clear(); public: ! FreeRegionList(const char* name, HeapRegionSetChecker* checker = NULL): ! HeapRegionSetBase(name, checker) { ! clear(); ! } void verify_list(); #ifdef ASSERT bool contains(HeapRegion* hr) const { --- 134,194 ---- // sorted list. We should try to avoid doing operations that iterate over // such lists in performance critical paths. Typically we should // add / remove one region at a time or concatenate two lists. class FreeRegionListIterator; + class G1NUMA; class FreeRegionList : public HeapRegionSetBase { friend class FreeRegionListIterator; private: + + // This class is only initialized if there are multiple active nodes. + class NodeInfo : public CHeapObj<mtGC> { + G1NUMA* _numa; + uint* _length_of_node; + uint _num_nodes; + + public: + NodeInfo(); + ~NodeInfo(); + + inline void increase_length(uint node_index); + inline void decrease_length(uint node_index); + + inline uint length(uint index) const; + + void clear(); + + void add(NodeInfo* info); + }; + HeapRegion* _head; HeapRegion* _tail; // _last is used to keep track of where we added an element the last // time. It helps to improve performance when adding several ordered items in a row. HeapRegion* _last; + NodeInfo* _node_info; + static uint _unrealistically_long_length; inline HeapRegion* remove_from_head_impl(); inline HeapRegion* remove_from_tail_impl(); + inline void increase_length(uint node_index); + inline void decrease_length(uint node_index); + protected: // See the comment for HeapRegionSetBase::clear() virtual void clear(); public: ! FreeRegionList(const char* name, HeapRegionSetChecker* checker = NULL); ! ~FreeRegionList(); void verify_list(); #ifdef ASSERT bool contains(HeapRegion* hr) const {
*** 180,191 **** // Removes from head or tail based on the given argument. HeapRegion* remove_region(bool from_head); HeapRegion* remove_region_with_node_index(bool from_head, ! const uint requested_node_index, ! uint* region_node_index); // Merge two ordered lists. The result is also ordered. The order is // determined by hrm_index. void add_ordered(FreeRegionList* from_list); --- 205,215 ---- // Removes from head or tail based on the given argument. HeapRegion* remove_region(bool from_head); HeapRegion* remove_region_with_node_index(bool from_head, ! uint requested_node_index); // Merge two ordered lists. The result is also ordered. The order is // determined by hrm_index. void add_ordered(FreeRegionList* from_list);
*** 198,207 **** --- 222,234 ---- void remove_starting_at(HeapRegion* first, uint num_regions); virtual void verify(); uint num_of_regions_in_range(uint start, uint end) const; + + using HeapRegionSetBase::length; + uint length(uint node_index) const; }; // Iterator class that provides a convenient way to iterate over the // regions of a FreeRegionList.
< prev index next >