8317594: G1: Refactor find_empty_from_idx_reverse

Reviewed-by: tschatzl, iwalulya
This commit is contained in:
Albert Mingkun Yang 2023-10-09 10:39:34 +00:00
parent 6ddbfaae49
commit a57ae7e7d4
2 changed files with 22 additions and 17 deletions

View File

@ -614,7 +614,7 @@ uint HeapRegionManager::shrink_by(uint num_regions_to_remove) {
}
uint removed = 0;
uint cur = _allocated_heapregions_length - 1;
uint cur = _allocated_heapregions_length;
uint idx_last_found = 0;
uint num_last_found = 0;
@ -646,29 +646,34 @@ void HeapRegionManager::shrink_at(uint index, size_t num_regions) {
}
uint HeapRegionManager::find_empty_from_idx_reverse(uint start_idx, uint* res_idx) const {
guarantee(start_idx < _allocated_heapregions_length, "checking");
guarantee(start_idx <= _allocated_heapregions_length, "checking");
guarantee(res_idx != nullptr, "checking");
uint num_regions_found = 0;
auto is_available_and_empty = [&] (uint index) {
return is_available(index) && at(index)->is_empty();
};
jlong cur = start_idx;
while (cur != -1 && !(is_available(cur) && at(cur)->is_empty())) {
cur--;
uint i = start_idx;
while (i > 0 && !is_available_and_empty(i-1)) {
i--;
}
if (cur == -1) {
return num_regions_found;
if (i == 0) {
// Found nothing
return 0;
}
jlong old_cur = cur;
// cur indexes the first empty region
while (cur != -1 && is_available(cur) && at(cur)->is_empty()) {
cur--;
uint end = i;
while (i > 0 && is_available_and_empty(i-1)) {
i--;
}
*res_idx = cur + 1;
num_regions_found = old_cur - cur;
uint start = i;
uint num_regions_found = end - start;
*res_idx = start;
#ifdef ASSERT
for (uint i = *res_idx; i < (*res_idx + num_regions_found); i++) {
assert(at(i)->is_empty(), "just checking");
for (uint j = *res_idx; j < (*res_idx + num_regions_found); j++) {
assert(at(j)->is_empty(), "just checking");
}
#endif
return num_regions_found;

View File

@ -106,7 +106,7 @@ class HeapRegionManager: public CHeapObj<mtGC> {
void assert_contiguous_range(uint start, uint num_regions) NOT_DEBUG_RETURN;
// Finds the next sequence of empty regions starting from start_idx, going backwards in
// Finds the next sequence of empty regions starting from start_idx (exclusive), going backwards in
// the heap. Returns the length of the sequence found. If this value is zero, no
// sequence could be found, otherwise res_idx contains the start index of this range.
uint find_empty_from_idx_reverse(uint start_idx, uint* res_idx) const;