< 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 >