< prev index next >
src/share/vm/gc/g1/heapRegionManager.cpp
Print this page
*** 276,285 ****
--- 276,310 ----
err_msg("The region at the current position %u must be available or at the end of the heap.", cur));
#endif
return num_regions;
}
+ uint HeapRegionManager::find_highest_available(bool* expanded) {
+ // Loop downwards from the highest region index, looking for an
+ // entry which is either free or not yet committed. If not yet
+ // committed, expand_at that index, and set the 'expanded' output
+ // bool result to true.
+ uint curr = max_length() - 1;
+ while (curr != 0) {
+ HeapRegion *hr = _regions.get_by_index(curr);
+ if (hr == NULL) {
+ uint res = expand_at(curr, 1);
+ if (res == 1) {
+ *expanded = true;
+ return curr;
+ }
+ } else {
+ if (hr->is_free()) {
+ *expanded = false;
+ return curr;
+ }
+ }
+ curr--;
+ }
+ return G1_NO_HRM_INDEX;
+ }
+
void HeapRegionManager::par_iterate(HeapRegionClosure* blk, uint worker_id, HeapRegionClaimer* hrclaimer, bool concurrent) const {
const uint start_index = hrclaimer->start_region_for_worker(worker_id);
// Every worker will actually look at all regions, skipping over regions that
// are currently not committed.
*** 434,444 ****
continue;
}
num_committed++;
HeapRegion* hr = _regions.get_by_index(i);
guarantee(hr != NULL, err_msg("invariant: i: %u", i));
! guarantee(!prev_committed || hr->bottom() == prev_end,
err_msg("invariant i: %u "HR_FORMAT" prev_end: "PTR_FORMAT,
i, HR_FORMAT_PARAMS(hr), p2i(prev_end)));
guarantee(hr->hrm_index() == i,
err_msg("invariant: i: %u hrm_index(): %u", i, hr->hrm_index()));
// Asserts will fire if i is >= _length
--- 459,469 ----
continue;
}
num_committed++;
HeapRegion* hr = _regions.get_by_index(i);
guarantee(hr != NULL, err_msg("invariant: i: %u", i));
! guarantee(!prev_committed || hr->bottom() == prev_end || hr->is_archive(),
err_msg("invariant i: %u "HR_FORMAT" prev_end: "PTR_FORMAT,
i, HR_FORMAT_PARAMS(hr), p2i(prev_end)));
guarantee(hr->hrm_index() == i,
err_msg("invariant: i: %u hrm_index(): %u", i, hr->hrm_index()));
// Asserts will fire if i is >= _length
< prev index next >