< prev index next > src/hotspot/share/gc/shenandoah/shenandoahClosures.inline.hpp
Print this page
}
template <bool CONCURRENT, bool STABLE_THREAD>
template <class T>
void ShenandoahEvacuateUpdateRootClosureBase<CONCURRENT, STABLE_THREAD>::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(_heap->is_evacuation_in_progress(), "Performance: no reason to call this otherwise");
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) {
Thread* thr = STABLE_THREAD ? _thread : Thread::current();
assert(thr == Thread::current(), "Wrong thread");
ShenandoahNMethodAndDisarmClosure::ShenandoahNMethodAndDisarmClosure(OopClosure* cl) :
NMethodToOopClosure(cl, true /* fix_relocations */) {}
void ShenandoahNMethodAndDisarmClosure::do_nmethod(nmethod* nm) {
assert(nm != nullptr, "Sanity");
- assert(!ShenandoahNMethod::gc_data(nm)->is_unregistered(), "Should not be here");
+ ShenandoahNMethod* data = ShenandoahNMethod::gc_data(nm);
+ ShenandoahNMethodLocker locker(data->lock());
+ assert(!data->is_unregistered(), "Should not be here");
NMethodToOopClosure::do_nmethod(nm);
- ShenandoahNMethod::disarm_nmethod(nm);
+ ShenandoahNMethod::complete_and_disarm_nmethod(nm);
}
-
//
// ========= Update References
//
template <ShenandoahGenerationType GENERATION>
< prev index next >