689
690 public:
691 ShenandoahTraversalFixRootsTask(ShenandoahRootUpdater* rp) :
692 AbstractGangTask("Shenandoah traversal fix roots"),
693 _rp(rp) {
694 assert(ShenandoahHeap::heap()->has_forwarded_objects(), "Must be");
695 }
696
697 void work(uint worker_id) {
698 ShenandoahParallelWorkerSession worker_session(worker_id);
699 ShenandoahTraversalFixRootsClosure cl;
700 ShenandoahForwardedIsAliveClosure is_alive;
701 _rp->roots_do<ShenandoahForwardedIsAliveClosure, ShenandoahTraversalFixRootsClosure>(worker_id, &is_alive, &cl);
702 }
703 };
704
705 void ShenandoahTraversalGC::fixup_roots() {
706 #if COMPILER2_OR_JVMCI
707 DerivedPointerTable::clear();
708 #endif
709 ShenandoahRootUpdater rp(_heap->workers()->active_workers(), ShenandoahPhaseTimings::final_traversal_update_roots, true /* update code cache */);
710 ShenandoahTraversalFixRootsTask update_roots_task(&rp);
711 _heap->workers()->run_task(&update_roots_task);
712 #if COMPILER2_OR_JVMCI
713 DerivedPointerTable::update_pointers();
714 #endif
715 }
716
717 void ShenandoahTraversalGC::reset() {
718 _task_queues->clear();
719 }
720
721 ShenandoahObjToScanQueueSet* ShenandoahTraversalGC::task_queues() {
722 return _task_queues;
723 }
724
725 class ShenandoahTraversalCancelledGCYieldClosure : public YieldClosure {
726 private:
727 ShenandoahHeap* const _heap;
728 public:
729 ShenandoahTraversalCancelledGCYieldClosure() : _heap(ShenandoahHeap::heap()) {};
|
689
690 public:
691 ShenandoahTraversalFixRootsTask(ShenandoahRootUpdater* rp) :
692 AbstractGangTask("Shenandoah traversal fix roots"),
693 _rp(rp) {
694 assert(ShenandoahHeap::heap()->has_forwarded_objects(), "Must be");
695 }
696
697 void work(uint worker_id) {
698 ShenandoahParallelWorkerSession worker_session(worker_id);
699 ShenandoahTraversalFixRootsClosure cl;
700 ShenandoahForwardedIsAliveClosure is_alive;
701 _rp->roots_do<ShenandoahForwardedIsAliveClosure, ShenandoahTraversalFixRootsClosure>(worker_id, &is_alive, &cl);
702 }
703 };
704
705 void ShenandoahTraversalGC::fixup_roots() {
706 #if COMPILER2_OR_JVMCI
707 DerivedPointerTable::clear();
708 #endif
709 ShenandoahRootUpdater rp(_heap->workers()->active_workers(), ShenandoahPhaseTimings::final_traversal_update_roots);
710 ShenandoahTraversalFixRootsTask update_roots_task(&rp);
711 _heap->workers()->run_task(&update_roots_task);
712 #if COMPILER2_OR_JVMCI
713 DerivedPointerTable::update_pointers();
714 #endif
715 }
716
717 void ShenandoahTraversalGC::reset() {
718 _task_queues->clear();
719 }
720
721 ShenandoahObjToScanQueueSet* ShenandoahTraversalGC::task_queues() {
722 return _task_queues;
723 }
724
725 class ShenandoahTraversalCancelledGCYieldClosure : public YieldClosure {
726 private:
727 ShenandoahHeap* const _heap;
728 public:
729 ShenandoahTraversalCancelledGCYieldClosure() : _heap(ShenandoahHeap::heap()) {};
|