< 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 >