8255036: Shenandoah: Reset GC state for root verifier

Reviewed-by: rkennke
This commit is contained in:
Zhengyu Gu 2020-10-21 14:42:37 +00:00
parent 839f01ddf5
commit c9269bf59e
3 changed files with 26 additions and 17 deletions

@ -40,6 +40,18 @@
#include "runtime/thread.hpp"
#include "utilities/debug.hpp"
ShenandoahGCStateResetter::ShenandoahGCStateResetter() :
_gc_state(ShenandoahHeap::heap()->gc_state()),
_concurrent_weak_root_in_progress(ShenandoahHeap::heap()->is_concurrent_weak_root_in_progress()) {
}
ShenandoahGCStateResetter::~ShenandoahGCStateResetter() {
ShenandoahHeap* const heap = ShenandoahHeap::heap();
heap->_gc_state.set(_gc_state);
assert(heap->gc_state() == _gc_state, "Should be restored");
heap->set_concurrent_weak_root_in_progress(_concurrent_weak_root_in_progress);
}
// Check for overflow of number of root types.
STATIC_ASSERT((static_cast<uint>(ShenandoahRootVerifier::AllRoots) + 1) > static_cast<uint>(ShenandoahRootVerifier::AllRoots));
@ -60,6 +72,8 @@ ShenandoahRootVerifier::RootTypes ShenandoahRootVerifier::combine(RootTypes t1,
}
void ShenandoahRootVerifier::oops_do(OopClosure* oops) {
ShenandoahGCStateResetter resetter;
CodeBlobToOopClosure blobs(oops, !CodeBlobToOopClosure::FixRelocations);
if (verify(CodeRoots)) {
shenandoah_assert_locked_or_safepoint(CodeCache_lock);
@ -108,6 +122,7 @@ void ShenandoahRootVerifier::oops_do(OopClosure* oops) {
}
void ShenandoahRootVerifier::roots_do(OopClosure* oops) {
ShenandoahGCStateResetter resetter;
shenandoah_assert_safepoint();
CodeBlobToOopClosure blobs(oops, !CodeBlobToOopClosure::FixRelocations);
@ -133,6 +148,7 @@ void ShenandoahRootVerifier::roots_do(OopClosure* oops) {
}
void ShenandoahRootVerifier::strong_roots_do(OopClosure* oops) {
ShenandoahGCStateResetter resetter;
shenandoah_assert_safepoint();
CodeBlobToOopClosure blobs(oops, !CodeBlobToOopClosure::FixRelocations);

@ -28,6 +28,16 @@
#include "memory/allocation.hpp"
#include "memory/iterator.hpp"
class ShenandoahGCStateResetter : public StackObj {
private:
const char _gc_state;
const bool _concurrent_weak_root_in_progress;
public:
ShenandoahGCStateResetter();
~ShenandoahGCStateResetter();
};
class ShenandoahRootVerifier : public StackObj {
public:
enum RootTypes {

@ -592,23 +592,6 @@ public:
}
};
class ShenandoahGCStateResetter : public StackObj {
private:
ShenandoahHeap* const _heap;
char _gc_state;
public:
ShenandoahGCStateResetter() : _heap(ShenandoahHeap::heap()) {
_gc_state = _heap->gc_state();
_heap->_gc_state.clear();
}
~ShenandoahGCStateResetter() {
_heap->_gc_state.set(_gc_state);
assert(_heap->gc_state() == _gc_state, "Should be restored");
}
};
void ShenandoahVerifier::verify_at_safepoint(const char *label,
VerifyForwarded forwarded, VerifyMarked marked,
VerifyCollectionSet cset,