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