4040#include " runtime/thread.hpp"
4141#include " utilities/debug.hpp"
4242
43+ ShenandoahGCStateResetter::ShenandoahGCStateResetter () :
44+ _gc_state(ShenandoahHeap::heap()->gc_state()),
45+ _concurrent_weak_root_in_progress(ShenandoahHeap::heap()->is_concurrent_weak_root_in_progress()) {
46+ }
47+
48+ ShenandoahGCStateResetter::~ShenandoahGCStateResetter () {
49+ ShenandoahHeap* const heap = ShenandoahHeap::heap ();
50+ heap->_gc_state .set (_gc_state);
51+ assert (heap->gc_state () == _gc_state, " Should be restored" );
52+ heap->set_concurrent_weak_root_in_progress (_concurrent_weak_root_in_progress);
53+ }
54+
4355// Check for overflow of number of root types.
4456STATIC_ASSERT ((static_cast <uint>(ShenandoahRootVerifier::AllRoots) + 1) > static_cast<uint>(ShenandoahRootVerifier::AllRoots));
4557
@@ -60,6 +72,8 @@ ShenandoahRootVerifier::RootTypes ShenandoahRootVerifier::combine(RootTypes t1,
6072}
6173
6274void ShenandoahRootVerifier::oops_do (OopClosure* oops) {
75+ ShenandoahGCStateResetter resetter;
76+
6377 CodeBlobToOopClosure blobs (oops, !CodeBlobToOopClosure::FixRelocations);
6478 if (verify (CodeRoots)) {
6579 shenandoah_assert_locked_or_safepoint (CodeCache_lock);
@@ -108,6 +122,7 @@ void ShenandoahRootVerifier::oops_do(OopClosure* oops) {
108122}
109123
110124void ShenandoahRootVerifier::roots_do (OopClosure* oops) {
125+ ShenandoahGCStateResetter resetter;
111126 shenandoah_assert_safepoint ();
112127
113128 CodeBlobToOopClosure blobs (oops, !CodeBlobToOopClosure::FixRelocations);
@@ -133,6 +148,7 @@ void ShenandoahRootVerifier::roots_do(OopClosure* oops) {
133148}
134149
135150void ShenandoahRootVerifier::strong_roots_do (OopClosure* oops) {
151+ ShenandoahGCStateResetter resetter;
136152 shenandoah_assert_safepoint ();
137153
138154 CodeBlobToOopClosure blobs (oops, !CodeBlobToOopClosure::FixRelocations);
0 commit comments