diff --git a/src/hotspot/share/gc/shenandoah/shenandoahRootVerifier.cpp b/src/hotspot/share/gc/shenandoah/shenandoahRootVerifier.cpp index 3fbf3e8d6d5..4c7ae68fdbe 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahRootVerifier.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahRootVerifier.cpp @@ -46,13 +46,19 @@ ShenandoahGCStateResetter::ShenandoahGCStateResetter() : _heap(ShenandoahHeap::heap()), - _gc_state(_heap->gc_state()) { + _saved_gc_state(_heap->gc_state()), + _saved_gc_state_changed(_heap->_gc_state_changed) { + // Clear state to deactivate barriers. Indicate that state has changed + // so that verifier threads will use this value, rather than thread local + // values (which we are _not_ changing here). _heap->_gc_state.clear(); + _heap->_gc_state_changed = true; } ShenandoahGCStateResetter::~ShenandoahGCStateResetter() { - _heap->_gc_state.set(_gc_state); - assert(_heap->gc_state() == _gc_state, "Should be restored"); + _heap->_gc_state.set(_saved_gc_state); + _heap->_gc_state_changed = _saved_gc_state_changed; + assert(_heap->gc_state() == _saved_gc_state, "Should be restored"); } void ShenandoahRootVerifier::roots_do(OopIterateClosure* oops) { diff --git a/src/hotspot/share/gc/shenandoah/shenandoahRootVerifier.hpp b/src/hotspot/share/gc/shenandoah/shenandoahRootVerifier.hpp index da7ca864dbb..405c69c4160 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahRootVerifier.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahRootVerifier.hpp @@ -32,7 +32,8 @@ class ShenandoahGCStateResetter : public StackObj { private: ShenandoahHeap* const _heap; - const char _gc_state; + const char _saved_gc_state; + const bool _saved_gc_state_changed; public: ShenandoahGCStateResetter();