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
|