# HG changeset patch # User ehelin # Date 1441970405 -7200 # Node ID d238cd8170fc4005ed2a3ffab71acc203fb055c5 # Parent 3628aefe13d552c9b6be17000c079c11f0f304e0 8135253: Add push method to CollectionSetChooser Reviewed-by: mgerdin, tschatzl diff -r 3628aefe13d5 -r d238cd8170fc hotspot/src/share/vm/gc/g1/collectionSetChooser.cpp --- a/hotspot/src/share/vm/gc/g1/collectionSetChooser.cpp Fri Sep 11 10:02:35 2015 +0200 +++ b/hotspot/src/share/vm/gc/g1/collectionSetChooser.cpp Fri Sep 11 13:20:05 2015 +0200 @@ -83,7 +83,7 @@ _regions((ResourceObj::set_allocation_type((address) &_regions, ResourceObj::C_HEAP), 100), true /* C_Heap */), - _curr_index(0), _length(0), _first_par_unreserved_idx(0), + _front(0), _end(0), _first_par_unreserved_idx(0), _region_live_threshold_bytes(0), _remaining_reclaimable_bytes(0) { _region_live_threshold_bytes = HeapRegion::GrainBytes * (size_t) G1MixedGCLiveThresholdPercent / 100; @@ -91,19 +91,19 @@ #ifndef PRODUCT void CollectionSetChooser::verify() { - guarantee(_length <= regions_length(), - err_msg("_length: %u regions length: %u", _length, regions_length())); - guarantee(_curr_index <= _length, - err_msg("_curr_index: %u _length: %u", _curr_index, _length)); + guarantee(_end <= regions_length(), + err_msg("_end: %u regions length: %u", _end, regions_length())); + guarantee(_front <= _end, + err_msg("_front: %u _end: %u", _front, _end)); uint index = 0; size_t sum_of_reclaimable_bytes = 0; - while (index < _curr_index) { + while (index < _front) { guarantee(regions_at(index) == NULL, - "all entries before _curr_index should be NULL"); + "all entries before _front should be NULL"); index += 1; } HeapRegion *prev = NULL; - while (index < _length) { + while (index < _end) { HeapRegion *curr = regions_at(index++); guarantee(curr != NULL, "Regions in _regions array cannot be NULL"); guarantee(!curr->is_young(), "should not be young!"); @@ -132,15 +132,15 @@ regions_trunc_to(_first_par_unreserved_idx); } _regions.sort(order_regions); - assert(_length <= regions_length(), "Requirement"); + assert(_end <= regions_length(), "Requirement"); #ifdef ASSERT - for (uint i = 0; i < _length; i++) { + for (uint i = 0; i < _end; i++) { assert(regions_at(i) != NULL, "Should be true by sorting!"); } #endif // ASSERT if (G1PrintRegionLivenessInfo) { G1PrintRegionLivenessInfoClosure cl(gclog_or_tty, "Post-Sorting"); - for (uint i = 0; i < _length; ++i) { + for (uint i = 0; i < _end; ++i) { HeapRegion* r = regions_at(i); cl.doHeapRegion(r); } @@ -154,11 +154,19 @@ err_msg("Pinned region shouldn't be added to the collection set (index %u)", hr->hrm_index())); assert(!hr->is_young(), "should not be young!"); _regions.append(hr); - _length++; + _end++; _remaining_reclaimable_bytes += hr->reclaimable_bytes(); hr->calc_gc_efficiency(); } +void CollectionSetChooser::push(HeapRegion* hr) { + assert(hr != NULL, "Can't put back a NULL region"); + assert(_front >= 1, "Too many regions have been put back"); + _front--; + regions_at_put(_front, hr); + _remaining_reclaimable_bytes += hr->reclaimable_bytes(); +} + void CollectionSetChooser::prepare_for_par_region_addition(uint n_threads, uint n_regions, uint chunk_size) { @@ -193,7 +201,7 @@ // We could have just used atomics instead of taking the // lock. However, we currently don't have an atomic add for size_t. MutexLockerEx x(ParGCRareEvent_lock, Mutex::_no_safepoint_check_flag); - _length += region_num; + _end += region_num; _remaining_reclaimable_bytes += reclaimable_bytes; } else { assert(reclaimable_bytes == 0, "invariant"); @@ -202,7 +210,7 @@ void CollectionSetChooser::clear() { _regions.clear(); - _curr_index = 0; - _length = 0; + _front = 0; + _end = 0; _remaining_reclaimable_bytes = 0; }; diff -r 3628aefe13d5 -r d238cd8170fc hotspot/src/share/vm/gc/g1/collectionSetChooser.hpp --- a/hotspot/src/share/vm/gc/g1/collectionSetChooser.hpp Fri Sep 11 10:02:35 2015 +0200 +++ b/hotspot/src/share/vm/gc/g1/collectionSetChooser.hpp Fri Sep 11 13:20:05 2015 +0200 @@ -48,12 +48,10 @@ // The index of the next candidate old region to be considered for // addition to the CSet. - uint _curr_index; + uint _front; - // The number of candidate old regions added to the CSet chooser. - // Note: this is not updated when removing a region using - // remove_and_move_to_next() below. - uint _length; + // The index of the last candidate old region + uint _end; // Keeps track of the start of the next array chunk to be claimed by // parallel GC workers. @@ -73,31 +71,33 @@ // collection without removing it from the CSet chooser. HeapRegion* peek() { HeapRegion* res = NULL; - if (_curr_index < _length) { - res = regions_at(_curr_index); + if (_front < _end) { + res = regions_at(_front); assert(res != NULL, err_msg("Unexpected NULL hr in _regions at index %u", - _curr_index)); + _front)); } return res; } // Remove the given region from the CSet chooser and move to the - // next one. The given region should be the current candidate region - // in the CSet chooser. - void remove_and_move_to_next(HeapRegion* hr) { + // next one. + HeapRegion* pop() { + HeapRegion* hr = regions_at(_front); assert(hr != NULL, "pre-condition"); - assert(_curr_index < _length, "pre-condition"); - assert(regions_at(_curr_index) == hr, "pre-condition"); - regions_at_put(_curr_index, NULL); + assert(_front < _end, "pre-condition"); + regions_at_put(_front, NULL); assert(hr->reclaimable_bytes() <= _remaining_reclaimable_bytes, err_msg("remaining reclaimable bytes inconsistent " "from region: " SIZE_FORMAT " remaining: " SIZE_FORMAT, hr->reclaimable_bytes(), _remaining_reclaimable_bytes)); _remaining_reclaimable_bytes -= hr->reclaimable_bytes(); - _curr_index += 1; + _front += 1; + return hr; } + void push(HeapRegion* hr); + CollectionSetChooser(); void sort_regions(); @@ -113,7 +113,7 @@ } // Returns the number candidate old regions added - uint length() { return _length; } + uint length() { return _end; } // Serial version. void add_region(HeapRegion *hr); @@ -135,7 +135,7 @@ void clear(); // Return the number of candidate regions that remain to be collected. - uint remaining_regions() { return _length - _curr_index; } + uint remaining_regions() { return _end - _front; } // Determine whether the CSet chooser has more candidate regions or not. bool is_empty() { return remaining_regions() == 0; } diff -r 3628aefe13d5 -r d238cd8170fc hotspot/src/share/vm/gc/g1/g1CollectorPolicy.cpp --- a/hotspot/src/share/vm/gc/g1/g1CollectorPolicy.cpp Fri Sep 11 10:02:35 2015 +0200 +++ b/hotspot/src/share/vm/gc/g1/g1CollectorPolicy.cpp Fri Sep 11 13:20:05 2015 +0200 @@ -2037,7 +2037,7 @@ // We will add this region to the CSet. time_remaining_ms = MAX2(time_remaining_ms - predicted_time_ms, 0.0); predicted_old_time_ms += predicted_time_ms; - cset_chooser->remove_and_move_to_next(hr); + cset_chooser->pop(); // already have region via peek() _g1->old_set_remove(hr); add_old_region_to_cset(hr);