< 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,36 +134,61 @@
// 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):
- HeapRegionSetBase(name, checker) {
- clear();
- }
+ FreeRegionList(const char* name, HeapRegionSetChecker* checker = NULL);
+ ~FreeRegionList();
void verify_list();
#ifdef ASSERT
bool contains(HeapRegion* hr) const {
@@ -180,12 +205,11 @@
// 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);
+ 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,10 +222,13 @@
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 >