< prev index next >

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

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

*** 524,537 **** --- 524,560 ---- void do_object(oop obj) { obj->oop_iterate(_cl); } }; + template <class T> + class ShenandoahObjectToOopBoundedClosure : public ObjectClosure { + T* _cl; + MemRegion _bounds; + public: + ShenandoahObjectToOopBoundedClosure(T* cl, HeapWord* bottom, HeapWord* top) : + _cl(cl), _bounds(bottom, top) {} + + void do_object(oop obj) { + obj->oop_iterate(_cl, _bounds); + } + }; template<class T> inline void ShenandoahHeap::marked_object_oop_iterate(ShenandoahHeapRegion* region, T* cl) { + if (region->is_humongous()) { + HeapWord* bottom = region->bottom(); + HeapWord* top = region->top(); + // Go to start of humongous region. + while (! region->is_humongous_start()) { + region = _ordered_regions->get(region->region_number() - 1); + } + ShenandoahObjectToOopBoundedClosure<T> objs(cl, bottom, top); + marked_object_iterate(region, &objs); + } else { ShenandoahObjectToOopClosure<T> objs(cl); marked_object_iterate(region, &objs); + } } template<class T> inline void ShenandoahHeap::marked_object_oop_iterate(ShenandoahHeapRegion* region, T* cl, HeapWord* limit) { ShenandoahObjectToOopClosure<T> objs(cl);
< prev index next >