8256688: Shenandoah: Lock rank inversion after JDK-8212879

Reviewed-by: rkennke
This commit is contained in:
Zhengyu Gu 2020-11-20 12:51:11 +00:00
parent aeba9259b2
commit 266dea06ec
3 changed files with 17 additions and 2 deletions

View File

@ -1991,9 +1991,13 @@ public:
MutexLocker mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
_nmethod_itr.nmethods_do_begin();
}
_dedup_roots.prologue();
}
~ShenandoahConcurrentWeakRootsEvacUpdateTask() {
_dedup_roots.epilogue();
if (_concurrent_class_unloading) {
MutexLocker mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
_nmethod_itr.nmethods_do_end();

View File

@ -78,6 +78,9 @@ void ShenandoahStringDedupRoots::oops_do(BoolObjectClosure* is_alive, OopClosure
ShenandoahConcurrentStringDedupRoots::ShenandoahConcurrentStringDedupRoots(ShenandoahPhaseTimings::Phase phase) :
_phase(phase) {
}
void ShenandoahConcurrentStringDedupRoots::prologue() {
if (ShenandoahStringDedup::is_enabled()) {
StringDedupTable_lock->lock_without_safepoint_check();
StringDedupQueue_lock->lock_without_safepoint_check();
@ -85,7 +88,7 @@ ShenandoahConcurrentStringDedupRoots::ShenandoahConcurrentStringDedupRoots(Shena
}
}
ShenandoahConcurrentStringDedupRoots::~ShenandoahConcurrentStringDedupRoots() {
void ShenandoahConcurrentStringDedupRoots::epilogue() {
if (ShenandoahStringDedup::is_enabled()) {
StringDedup::gc_epilogue();
StringDedupQueue_lock->unlock();
@ -223,8 +226,13 @@ ShenandoahHeapIterationRootScanner::ShenandoahHeapIterationRootScanner() :
_weak_roots(ShenandoahPhaseTimings::heap_iteration_roots),
_dedup_roots(ShenandoahPhaseTimings::heap_iteration_roots),
_code_roots(ShenandoahPhaseTimings::heap_iteration_roots) {
_dedup_roots.prologue();
}
ShenandoahHeapIterationRootScanner::~ShenandoahHeapIterationRootScanner() {
_dedup_roots.epilogue();
}
void ShenandoahHeapIterationRootScanner::roots_do(OopClosure* oops) {
assert(Thread::current()->is_VM_thread(), "Only by VM thread");
// Must use _claim_none to avoid interfering with concurrent CLDG iteration

View File

@ -93,7 +93,9 @@ private:
public:
ShenandoahConcurrentStringDedupRoots(ShenandoahPhaseTimings::Phase phase);
~ShenandoahConcurrentStringDedupRoots();
void prologue();
void epilogue();
void oops_do(BoolObjectClosure* is_alive, OopClosure* keep_alive, uint worker_id);
};
@ -191,6 +193,7 @@ private:
public:
ShenandoahHeapIterationRootScanner();
~ShenandoahHeapIterationRootScanner();
void roots_do(OopClosure* cl);
};