617 618 // Free remaining stacks 619 stacks->free(&_allocator); 620 } 621 622 class ZMarkConcurrentRootsIteratorClosure : public ZRootsIteratorClosure { 623 public: 624 virtual void do_oop(oop* p) { 625 ZBarrier::mark_barrier_on_oop_field(p, false /* finalizable */); 626 } 627 628 virtual void do_oop(narrowOop* p) { 629 ShouldNotReachHere(); 630 } 631 }; 632 633 634 class ZMarkConcurrentRootsTask : public ZTask { 635 private: 636 SuspendibleThreadSetJoiner _sts_joiner; 637 ZConcurrentRootsIterator _roots; 638 ZMarkConcurrentRootsIteratorClosure _cl; 639 640 public: 641 ZMarkConcurrentRootsTask(ZMark* mark) : 642 ZTask("ZMarkConcurrentRootsTask"), 643 _sts_joiner(true /* active */), 644 _roots(ClassLoaderData::_claim_strong), 645 _cl() { 646 ClassLoaderDataGraph_lock->lock(); 647 ClassLoaderDataGraph::clear_claimed_marks(); 648 } 649 650 ~ZMarkConcurrentRootsTask() { 651 ClassLoaderDataGraph_lock->unlock(); 652 } 653 654 virtual void work() { 655 _roots.oops_do(&_cl); 656 } 657 }; 658 659 class ZMarkTask : public ZTask { 660 private: 661 ZMark* const _mark; 662 const uint64_t _timeout_in_millis; 663 664 public: 665 ZMarkTask(ZMark* mark, uint64_t timeout_in_millis = 0) : 666 ZTask("ZMarkTask"), 667 _mark(mark), | 617 618 // Free remaining stacks 619 stacks->free(&_allocator); 620 } 621 622 class ZMarkConcurrentRootsIteratorClosure : public ZRootsIteratorClosure { 623 public: 624 virtual void do_oop(oop* p) { 625 ZBarrier::mark_barrier_on_oop_field(p, false /* finalizable */); 626 } 627 628 virtual void do_oop(narrowOop* p) { 629 ShouldNotReachHere(); 630 } 631 }; 632 633 634 class ZMarkConcurrentRootsTask : public ZTask { 635 private: 636 SuspendibleThreadSetJoiner _sts_joiner; 637 ZConcurrentRootsIteratorClaimStrong _roots; 638 ZMarkConcurrentRootsIteratorClosure _cl; 639 640 public: 641 ZMarkConcurrentRootsTask(ZMark* mark) : 642 ZTask("ZMarkConcurrentRootsTask"), 643 _sts_joiner(), 644 _roots(), 645 _cl() { 646 ClassLoaderDataGraph_lock->lock(); 647 } 648 649 ~ZMarkConcurrentRootsTask() { 650 ClassLoaderDataGraph_lock->unlock(); 651 } 652 653 virtual void work() { 654 _roots.oops_do(&_cl); 655 } 656 }; 657 658 class ZMarkTask : public ZTask { 659 private: 660 ZMark* const _mark; 661 const uint64_t _timeout_in_millis; 662 663 public: 664 ZMarkTask(ZMark* mark, uint64_t timeout_in_millis = 0) : 665 ZTask("ZMarkTask"), 666 _mark(mark), |