424 |
424 |
425 while ((removed < num_regions_to_remove) && |
425 while ((removed < num_regions_to_remove) && |
426 (num_last_found = find_empty_from_idx_reverse(cur, &idx_last_found)) > 0) { |
426 (num_last_found = find_empty_from_idx_reverse(cur, &idx_last_found)) > 0) { |
427 uint to_remove = MIN2(num_regions_to_remove - removed, num_last_found); |
427 uint to_remove = MIN2(num_regions_to_remove - removed, num_last_found); |
428 |
428 |
429 uncommit_regions(idx_last_found + num_last_found - to_remove, to_remove); |
429 shrink_at(idx_last_found + num_last_found - to_remove, to_remove); |
430 |
430 |
431 cur = idx_last_found; |
431 cur = idx_last_found; |
432 removed += to_remove; |
432 removed += to_remove; |
433 } |
433 } |
434 |
434 |
435 verify_optional(); |
435 verify_optional(); |
436 |
436 |
437 return removed; |
437 return removed; |
|
438 } |
|
439 |
|
440 void HeapRegionManager::shrink_at(uint index, size_t num_regions) { |
|
441 #ifdef ASSERT |
|
442 for (uint i = index; i < (index + num_regions); i++) { |
|
443 assert(is_available(i), err_msg("Expected available region at index %u", i)); |
|
444 assert(at(i)->is_empty(), err_msg("Expected empty region at index %u", i)); |
|
445 assert(at(i)->is_free(), err_msg("Expected free region at index %u", i)); |
|
446 } |
|
447 #endif |
|
448 uncommit_regions(index, num_regions); |
438 } |
449 } |
439 |
450 |
440 uint HeapRegionManager::find_empty_from_idx_reverse(uint start_idx, uint* res_idx) const { |
451 uint HeapRegionManager::find_empty_from_idx_reverse(uint start_idx, uint* res_idx) const { |
441 guarantee(start_idx < _allocated_heapregions_length, "checking"); |
452 guarantee(start_idx < _allocated_heapregions_length, "checking"); |
442 guarantee(res_idx != NULL, "checking"); |
453 guarantee(res_idx != NULL, "checking"); |