diff --git a/src/hotspot/share/gc/shenandoah/shenandoahClosures.hpp b/src/hotspot/share/gc/shenandoah/shenandoahClosures.hpp index 9f57189d319..cba3be0311c 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahClosures.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahClosures.hpp @@ -89,42 +89,23 @@ private: inline void do_oop_work(T* p); }; -template -class ShenandoahEvacuateUpdateMetadataClosure: public ShenandoahOopClosureBase { -private: +template +class ShenandoahEvacuateUpdateRootClosureBase : public ShenandoahOopClosureBase { +protected: ShenandoahHeap* const _heap; - Thread* const _thread; + Thread* const _thread; public: - inline ShenandoahEvacuateUpdateMetadataClosure(); + inline ShenandoahEvacuateUpdateRootClosureBase(); inline void do_oop(oop* p); inline void do_oop(narrowOop* p); - -private: +protected: template inline void do_oop_work(T* p); }; -// Context free version, cannot cache calling thread -class ShenandoahEvacuateUpdateRootsClosure : public ShenandoahOopClosureBase { -private: - ShenandoahHeap* const _heap; -public: - inline ShenandoahEvacuateUpdateRootsClosure(); - inline void do_oop(oop* p); - inline void do_oop(narrowOop* p); -protected: - template - inline void do_oop_work(T* p, Thread* thr); -}; - -class ShenandoahContextEvacuateUpdateRootsClosure : public ShenandoahEvacuateUpdateRootsClosure { -private: - Thread* const _thread; -public: - inline ShenandoahContextEvacuateUpdateRootsClosure(); - inline void do_oop(oop* p); - inline void do_oop(narrowOop* p); -}; +using ShenandoahEvacuateUpdateMetadataClosure = ShenandoahEvacuateUpdateRootClosureBase; +using ShenandoahEvacuateUpdateRootsClosure = ShenandoahEvacuateUpdateRootClosureBase; +using ShenandoahContextEvacuateUpdateRootsClosure = ShenandoahEvacuateUpdateRootClosureBase; template class ShenandoahCleanUpdateWeakOopsClosure : public OopClosure { diff --git a/src/hotspot/share/gc/shenandoah/shenandoahClosures.inline.hpp b/src/hotspot/share/gc/shenandoah/shenandoahClosures.inline.hpp index 851cb91b866..07660506d60 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahClosures.inline.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahClosures.inline.hpp @@ -109,53 +109,37 @@ void ShenandoahUpdateRefsClosure::do_oop_work(T* p) { void ShenandoahUpdateRefsClosure::do_oop(oop* p) { do_oop_work(p); } void ShenandoahUpdateRefsClosure::do_oop(narrowOop* p) { do_oop_work(p); } -template -ShenandoahEvacuateUpdateMetadataClosure::ShenandoahEvacuateUpdateMetadataClosure() : - _heap(ShenandoahHeap::heap()), _thread(Thread::current()) { +template +ShenandoahEvacuateUpdateRootClosureBase::ShenandoahEvacuateUpdateRootClosureBase() : + _heap(ShenandoahHeap::heap()), _thread(stable_thread ? Thread::current() : NULL) { } -template -template -void ShenandoahEvacuateUpdateMetadataClosure::do_oop_work(T* p) { - assert(_heap->is_concurrent_weak_root_in_progress() || - _heap->is_concurrent_strong_root_in_progress(), - "Only do this in root processing phase"); - assert(_thread == Thread::current(), "Wrong thread"); - - T o = RawAccess<>::oop_load(p); - if (! CompressedOops::is_null(o)) { - oop obj = CompressedOops::decode_not_null(o); - if (_heap->in_collection_set(obj)) { - assert(_heap->is_evacuation_in_progress(), "Only do this when evacuation is in progress"); - shenandoah_assert_marked(p, obj); - oop resolved = ShenandoahBarrierSet::resolve_forwarded_not_null(obj); - if (resolved == obj) { - resolved = _heap->evacuate_object(obj, _thread); - } - RawAccess::oop_store(p, resolved); - } +template +void ShenandoahEvacuateUpdateRootClosureBase::do_oop(oop* p) { + if (concurrent) { + ShenandoahEvacOOMScope scope; + do_oop_work(p); + } else { + do_oop_work(p); } } -template -void ShenandoahEvacuateUpdateMetadataClosure::do_oop(oop* p) { - do_oop_work(p); + +template +void ShenandoahEvacuateUpdateRootClosureBase::do_oop(narrowOop* p) { + if (concurrent) { + ShenandoahEvacOOMScope scope; + do_oop_work(p); + } else { + do_oop_work(p); + } } -template -void ShenandoahEvacuateUpdateMetadataClosure::do_oop(narrowOop* p) { - do_oop_work(p); -} - -ShenandoahEvacuateUpdateRootsClosure::ShenandoahEvacuateUpdateRootsClosure() : - _heap(ShenandoahHeap::heap()) { -} - -template -void ShenandoahEvacuateUpdateRootsClosure::do_oop_work(T* p, Thread* t) { +template +template +void ShenandoahEvacuateUpdateRootClosureBase::do_oop_work(T* p) { assert(_heap->is_concurrent_weak_root_in_progress() || _heap->is_concurrent_strong_root_in_progress(), "Only do this in root processing phase"); - assert(t == Thread::current(), "Wrong thread"); T o = RawAccess<>::oop_load(p); if (!CompressedOops::is_null(o)) { @@ -165,38 +149,20 @@ void ShenandoahEvacuateUpdateRootsClosure::do_oop_work(T* p, Thread* t) { shenandoah_assert_marked(p, obj); oop resolved = ShenandoahBarrierSet::resolve_forwarded_not_null(obj); if (resolved == obj) { - resolved = _heap->evacuate_object(obj, t); + Thread* thr = stable_thread ? _thread : Thread::current(); + assert(thr == Thread::current(), "Wrong thread"); + + resolved = _heap->evacuate_object(obj, thr); + } + if (atomic) { + ShenandoahHeap::atomic_update_oop(resolved, p, o); + } else { + RawAccess::oop_store(p, resolved); } - ShenandoahHeap::atomic_update_oop(resolved, p, o); } } } -void ShenandoahEvacuateUpdateRootsClosure::do_oop(oop* p) { - ShenandoahEvacOOMScope scope; - do_oop_work(p, Thread::current()); -} - -void ShenandoahEvacuateUpdateRootsClosure::do_oop(narrowOop* p) { - ShenandoahEvacOOMScope scope; - do_oop_work(p, Thread::current()); -} - -ShenandoahContextEvacuateUpdateRootsClosure::ShenandoahContextEvacuateUpdateRootsClosure() : - ShenandoahEvacuateUpdateRootsClosure(), - _thread(Thread::current()) { -} - -void ShenandoahContextEvacuateUpdateRootsClosure::do_oop(oop* p) { - ShenandoahEvacOOMScope scope; - do_oop_work(p, _thread); -} - -void ShenandoahContextEvacuateUpdateRootsClosure::do_oop(narrowOop* p) { - ShenandoahEvacOOMScope scope; - do_oop_work(p, _thread); -} - template ShenandoahCleanUpdateWeakOopsClosure::ShenandoahCleanUpdateWeakOopsClosure(IsAlive* is_alive, KeepAlive* keep_alive) : _is_alive(is_alive), _keep_alive(keep_alive) { diff --git a/src/hotspot/share/gc/shenandoah/shenandoahConcurrentGC.cpp b/src/hotspot/share/gc/shenandoah/shenandoahConcurrentGC.cpp index dec4f6959e9..2dbcad4e8ce 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahConcurrentGC.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahConcurrentGC.cpp @@ -834,7 +834,7 @@ void ShenandoahConcurrentGC::op_class_unloading() { class ShenandoahEvacUpdateCodeCacheClosure : public NMethodClosure { private: BarrierSetNMethod* const _bs; - ShenandoahEvacuateUpdateMetadataClosure<> _cl; + ShenandoahEvacuateUpdateMetadataClosure _cl; public: ShenandoahEvacUpdateCodeCacheClosure() : @@ -893,7 +893,7 @@ public: } { - ShenandoahEvacuateUpdateMetadataClosure<> cl; + ShenandoahEvacuateUpdateMetadataClosure cl; CLDToOopClosure clds(&cl, ClassLoaderData::_claim_strong); _cld_roots.cld_do(&clds, worker_id); } diff --git a/src/hotspot/share/gc/shenandoah/shenandoahNMethod.inline.hpp b/src/hotspot/share/gc/shenandoah/shenandoahNMethod.inline.hpp index c134abf19a6..dc559228ccf 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahNMethod.inline.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahNMethod.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2021, Red Hat, Inc. All rights reserved. + * Copyright (c) 2019, 2022, Red Hat, Inc. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -74,7 +74,7 @@ void ShenandoahNMethod::oops_do(OopClosure* oops, bool fix_relocations) { } void ShenandoahNMethod::heal_nmethod_metadata(ShenandoahNMethod* nmethod_data) { - ShenandoahEvacuateUpdateMetadataClosure<> cl; + ShenandoahEvacuateUpdateMetadataClosure cl; nmethod_data->oops_do(&cl, true /*fix relocation*/); }