< prev index next >

src/share/vm/gc/g1/heapRegionManager.cpp

Print this page
rev 8461 : imported patch webrev1.patch
rev 8462 : [mq]: version3

@@ -276,17 +276,16 @@
          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) {
+uint HeapRegionManager::find_highest_free(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.
+  // committed, expand_at that index.
   uint curr = max_length() - 1;
-  while (curr != 0) {
+  while (true) {
     HeapRegion *hr = _regions.get_by_index(curr);
     if (hr == NULL) {
       uint res = expand_at(curr, 1);
       if (res == 1) {
         *expanded = true;

@@ -296,13 +295,38 @@
       if (hr->is_free()) {
         *expanded = false;
         return curr;
       }
     }
+    if (curr == 0) {
+      return G1_NO_HRM_INDEX;
+    }
     curr--;
   }
-  return G1_NO_HRM_INDEX;
+}
+
+bool HeapRegionManager::allocate_containing_regions(MemRegion range, size_t* commit_count) {
+  size_t commits = 0;
+  uint start_index = (uint)_regions.get_index_by_address(range.start());
+  uint last_index = (uint)_regions.get_index_by_address(range.last());
+
+  // Ensure that each G1 region in the range is free, returning false if not.                                                        
+  // Commit those that are not yet available, and keep count.
+  for (uint curr_index = start_index; curr_index <= last_index; curr_index++) {
+    if (!is_available(curr_index)) {
+      commits++;
+      expand_at(curr_index, 1);
+    }
+    HeapRegion* curr_region  = _regions.get_by_index(curr_index);
+    if (!curr_region->is_free()) {
+      return false;
+    }
+  }
+
+  allocate_free_regions_starting_at(start_index, (last_index - start_index) + 1);
+  *commit_count = commits;
+  return true;
 }
 
 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);
 

@@ -459,11 +483,11 @@
       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(),
+    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
< prev index next >