diff --git a/src/hotspot/share/gc/z/zMark.cpp b/src/hotspot/share/gc/z/zMark.cpp index 4f19fc4..d93fdad 100644 --- a/src/hotspot/share/gc/z/zMark.cpp +++ b/src/hotspot/share/gc/z/zMark.cpp @@ -140,6 +140,24 @@ public: } }; +class ZMarkConcurrentRootsTask : public ZTask { +private: + ZMark* const _mark; + ZConcurrentRootsIterator _roots; + +public: + ZMarkConcurrentRootsTask(ZMark* mark) : + ZTask("ZMarkConcurrentRootsTask"), + _mark(mark), + _roots() {} + + virtual void work() { + ZMarkBarrierOopClosure cl; + _roots.oops_do(&cl); + } +}; + + void ZMark::start() { // Verification if (ZVerifyMarking) { @@ -154,6 +172,11 @@ void ZMark::start() { _workers->run_parallel(&task); } +void ZMark::mark_concurrent_roots() { + ZMarkConcurrentRootsTask task(this); + _workers->run_concurrent(&task); +} + void ZMark::prepare_work() { assert(_nworkers == _workers->nconcurrent(), "Invalid number of workers");