8245880: Shenandoah: check class unloading flag early in concurrent code root scan

Reviewed-by: shade
This commit is contained in:
Zhengyu Gu 2020-05-29 13:40:51 -04:00
parent d101efc16b
commit 4f9020f481

View File

@ -390,21 +390,23 @@ void ShenandoahConcurrentMark::initialize(uint workers) {
} }
void ShenandoahConcurrentMark::concurrent_scan_code_roots(uint worker_id, ReferenceProcessor* rp) { void ShenandoahConcurrentMark::concurrent_scan_code_roots(uint worker_id, ReferenceProcessor* rp) {
if (_heap->unload_classes()) {
return;
}
if (claim_codecache()) { if (claim_codecache()) {
ShenandoahObjToScanQueue* q = task_queues()->queue(worker_id); ShenandoahObjToScanQueue* q = task_queues()->queue(worker_id);
if (!_heap->unload_classes()) { MutexLocker mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
MutexLocker mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); // TODO: We can not honor StringDeduplication here, due to lock ranking
// TODO: We can not honor StringDeduplication here, due to lock ranking // inversion. So, we may miss some deduplication candidates.
// inversion. So, we may miss some deduplication candidates. if (_heap->has_forwarded_objects()) {
if (_heap->has_forwarded_objects()) { ShenandoahMarkResolveRefsClosure cl(q, rp);
ShenandoahMarkResolveRefsClosure cl(q, rp); CodeBlobToOopClosure blobs(&cl, !CodeBlobToOopClosure::FixRelocations);
CodeBlobToOopClosure blobs(&cl, !CodeBlobToOopClosure::FixRelocations); CodeCache::blobs_do(&blobs);
CodeCache::blobs_do(&blobs); } else {
} else { ShenandoahMarkRefsClosure cl(q, rp);
ShenandoahMarkRefsClosure cl(q, rp); CodeBlobToOopClosure blobs(&cl, !CodeBlobToOopClosure::FixRelocations);
CodeBlobToOopClosure blobs(&cl, !CodeBlobToOopClosure::FixRelocations); CodeCache::blobs_do(&blobs);
CodeCache::blobs_do(&blobs);
}
} }
} }
} }