src/share/vm/gc_implementation/g1/heapRegion.cpp

Print this page
rev 6796 : [mq]: templateOopIterate
rev 6801 : imported patch defaultToTrue

@@ -55,11 +55,11 @@
 
 FilterOutOfRegionClosure::FilterOutOfRegionClosure(HeapRegion* r,
                                                    OopClosure* oc) :
   _r_bottom(r->bottom()), _r_end(r->end()), _oc(oc) { }
 
-template<class ClosureType>
+template<bool nv, class ClosureType>
 HeapWord* walk_mem_region_loop(ClosureType* cl, G1CollectedHeap* g1h,
                                HeapRegion* hr,
                                HeapWord* cur, HeapWord* top) {
   oop cur_oop = oop(cur);
   size_t oop_size = hr->block_size(cur);

@@ -67,11 +67,11 @@
   while (next_obj < top) {
     // Keep filtering the remembered set.
     if (!g1h->is_obj_dead(cur_oop, hr)) {
       // Bottom lies entirely below top, so we can call the
       // non-memRegion version of oop_iterate below.
-      cur_oop->oop_iterate(cl);
+      cur_oop->oop_iterate<nv>(cl);
     }
     cur = next_obj;
     cur_oop = oop(cur);
     oop_size = hr->block_size(cur);
     next_obj = cur + oop_size;

@@ -99,43 +99,43 @@
   // Start filtering what we add to the remembered set. If the object is
   // not considered dead, either because it is marked (in the mark bitmap)
   // or it was allocated after marking finished, then we add it. Otherwise
   // we can safely ignore the object.
   if (!g1h->is_obj_dead(oop(bottom), _hr)) {
-    oop_size = oop(bottom)->oop_iterate(cl2, mr);
+    oop_size = oop(bottom)->oop_iterate<false>(cl2, mr);
   } else {
     oop_size = _hr->block_size(bottom);
   }
 
   bottom += oop_size;
 
   if (bottom < top) {
     // We replicate the loop below for several kinds of possible filters.
     switch (_fk) {
     case NoFilterKind:
-      bottom = walk_mem_region_loop(_cl, g1h, _hr, bottom, top);
+      bottom = walk_mem_region_loop<false>(_cl, g1h, _hr, bottom, top);
       break;
 
     case IntoCSFilterKind: {
       FilterIntoCSClosure filt(this, g1h, _cl);
-      bottom = walk_mem_region_loop(&filt, g1h, _hr, bottom, top);
+      bottom = walk_mem_region_loop<true>(&filt, g1h, _hr, bottom, top);
       break;
     }
 
     case OutOfRegionFilterKind: {
       FilterOutOfRegionClosure filt(_hr, _cl);
-      bottom = walk_mem_region_loop(&filt, g1h, _hr, bottom, top);
+      bottom = walk_mem_region_loop<true>(&filt, g1h, _hr, bottom, top);
       break;
     }
 
     default:
       ShouldNotReachHere();
     }
 
     // Last object. Need to do dead-obj filtering here too.
     if (!g1h->is_obj_dead(oop(bottom), _hr)) {
-      oop(bottom)->oop_iterate(cl2, mr);
+      oop(bottom)->oop_iterate<false>(cl2, mr);
     }
   }
 }
 
 // Minimum region size; we won't go lower than that.