< prev index next >

src/share/vm/gc/shenandoah/shenandoahHeap.inline.hpp

Print this page
rev 13132 : Correctly iterate references in humongous regions.


 509   assert(!oopDesc::is_null(obj), "sanity");
 510   assert(obj->is_oop(), "sanity");
 511   assert(is_in(obj), "sanity");
 512   assert(bitmap == _complete_mark_bit_map, "only iterate completed mark bitmap");
 513   assert(is_marked_complete(obj), "object expected to be marked");
 514 #endif
 515   cl->do_object(obj);
 516 }
 517 
 518 template <class T>
 519 class ShenandoahObjectToOopClosure : public ObjectClosure {
 520   T* _cl;
 521 public:
 522   ShenandoahObjectToOopClosure(T* cl) : _cl(cl) {}
 523 
 524   void do_object(oop obj) {
 525     obj->oop_iterate(_cl);
 526   }
 527 };
 528 












 529 template<class T>
 530 inline void ShenandoahHeap::marked_object_oop_iterate(ShenandoahHeapRegion* region, T* cl) {










 531   ShenandoahObjectToOopClosure<T> objs(cl);
 532   marked_object_iterate(region, &objs);

 533 }
 534 
 535 template<class T>
 536 inline void ShenandoahHeap::marked_object_oop_iterate(ShenandoahHeapRegion* region, T* cl, HeapWord* limit) {
 537   ShenandoahObjectToOopClosure<T> objs(cl);
 538   marked_object_iterate(region, &objs, limit);
 539 }
 540 #endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHHEAP_INLINE_HPP


 509   assert(!oopDesc::is_null(obj), "sanity");
 510   assert(obj->is_oop(), "sanity");
 511   assert(is_in(obj), "sanity");
 512   assert(bitmap == _complete_mark_bit_map, "only iterate completed mark bitmap");
 513   assert(is_marked_complete(obj), "object expected to be marked");
 514 #endif
 515   cl->do_object(obj);
 516 }
 517 
 518 template <class T>
 519 class ShenandoahObjectToOopClosure : public ObjectClosure {
 520   T* _cl;
 521 public:
 522   ShenandoahObjectToOopClosure(T* cl) : _cl(cl) {}
 523 
 524   void do_object(oop obj) {
 525     obj->oop_iterate(_cl);
 526   }
 527 };
 528 
 529 template <class T>
 530 class ShenandoahObjectToOopBoundedClosure : public ObjectClosure {
 531   T* _cl;
 532   MemRegion _bounds;
 533 public:
 534   ShenandoahObjectToOopBoundedClosure(T* cl, HeapWord* bottom, HeapWord* top) :
 535     _cl(cl), _bounds(bottom, top) {}
 536 
 537   void do_object(oop obj) {
 538     obj->oop_iterate(_cl, _bounds);
 539   }
 540 };
 541 template<class T>
 542 inline void ShenandoahHeap::marked_object_oop_iterate(ShenandoahHeapRegion* region, T* cl) {
 543   if (region->is_humongous()) {
 544     HeapWord* bottom = region->bottom();
 545     HeapWord* top = region->top();
 546     // Go to start of humongous region.
 547     while (! region->is_humongous_start()) {
 548       region = _ordered_regions->get(region->region_number() - 1);
 549     }
 550     ShenandoahObjectToOopBoundedClosure<T> objs(cl, bottom, top);
 551     marked_object_iterate(region, &objs);
 552   } else {
 553     ShenandoahObjectToOopClosure<T> objs(cl);
 554     marked_object_iterate(region, &objs);
 555   }
 556 }
 557 
 558 template<class T>
 559 inline void ShenandoahHeap::marked_object_oop_iterate(ShenandoahHeapRegion* region, T* cl, HeapWord* limit) {
 560   ShenandoahObjectToOopClosure<T> objs(cl);
 561   marked_object_iterate(region, &objs, limit);
 562 }
 563 #endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHHEAP_INLINE_HPP
< prev index next >