8255036: Shenandoah: Reset GC state for root verifier
Reviewed-by: rkennke
This commit is contained in:
parent
839f01ddf5
commit
c9269bf59e
src/hotspot/share/gc/shenandoah
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user