mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-27 14:54:52 +02:00
8225590: Shenandoah: Refactor ShenandoahClassLoaderDataRoots API
Reviewed-by: rkennke
This commit is contained in:
parent
9d9f9abe81
commit
2548e0bc5d
3 changed files with 30 additions and 12 deletions
|
@ -152,7 +152,7 @@ void ShenandoahRootEvacuator::roots_do(uint worker_id, OopClosure* oops) {
|
||||||
}
|
}
|
||||||
|
|
||||||
_thread_roots.oops_do(oops, NULL, worker_id);
|
_thread_roots.oops_do(oops, NULL, worker_id);
|
||||||
_cld_roots.clds_do(&clds, &clds, worker_id);
|
_cld_roots.cld_do(&clds, worker_id);
|
||||||
_code_roots.code_blobs_do(&blobsCl, worker_id);
|
_code_roots.code_blobs_do(&blobsCl, worker_id);
|
||||||
|
|
||||||
_weak_roots.oops_do<AlwaysTrueClosure, OopClosure>(&always_true, oops, worker_id);
|
_weak_roots.oops_do<AlwaysTrueClosure, OopClosure>(&always_true, oops, worker_id);
|
||||||
|
@ -182,7 +182,7 @@ void ShenandoahRootAdjuster::roots_do(uint worker_id, OopClosure* oops) {
|
||||||
_jni_roots.oops_do(oops, worker_id);
|
_jni_roots.oops_do(oops, worker_id);
|
||||||
|
|
||||||
_thread_roots.oops_do(oops, NULL, worker_id);
|
_thread_roots.oops_do(oops, NULL, worker_id);
|
||||||
_cld_roots.clds_do(&adjust_cld_closure, NULL, worker_id);
|
_cld_roots.cld_do(&adjust_cld_closure, worker_id);
|
||||||
_code_roots.code_blobs_do(&adjust_code_closure, worker_id);
|
_code_roots.code_blobs_do(&adjust_code_closure, worker_id);
|
||||||
|
|
||||||
_weak_roots.oops_do<AlwaysTrueClosure, OopClosure>(&always_true, oops, worker_id);
|
_weak_roots.oops_do<AlwaysTrueClosure, OopClosure>(&always_true, oops, worker_id);
|
||||||
|
@ -204,7 +204,7 @@ void ShenandoahRootAdjuster::roots_do(uint worker_id, OopClosure* oops) {
|
||||||
|
|
||||||
_serial_roots.oops_do(oops, 0);
|
_serial_roots.oops_do(oops, 0);
|
||||||
_jni_roots.oops_do(oops, 0);
|
_jni_roots.oops_do(oops, 0);
|
||||||
_cld_roots.clds_do(&clds, &clds, 0);
|
_cld_roots.cld_do(&clds, 0);
|
||||||
_thread_roots.threads_do(&tc_cl, 0);
|
_thread_roots.threads_do(&tc_cl, 0);
|
||||||
_code_roots.code_blobs_do(&code, 0);
|
_code_roots.code_blobs_do(&code, 0);
|
||||||
}
|
}
|
||||||
|
@ -219,6 +219,6 @@ void ShenandoahRootAdjuster::roots_do(uint worker_id, OopClosure* oops) {
|
||||||
|
|
||||||
_serial_roots.oops_do(oops, 0);
|
_serial_roots.oops_do(oops, 0);
|
||||||
_jni_roots.oops_do(oops, 0);
|
_jni_roots.oops_do(oops, 0);
|
||||||
_cld_roots.clds_do(&clds, NULL, 0);
|
_cld_roots.always_strong_cld_do(&clds, 0);
|
||||||
_thread_roots.threads_do(&tc_cl, 0);
|
_thread_roots.threads_do(&tc_cl, 0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -119,7 +119,8 @@ class ShenandoahClassLoaderDataRoots {
|
||||||
public:
|
public:
|
||||||
ShenandoahClassLoaderDataRoots();
|
ShenandoahClassLoaderDataRoots();
|
||||||
|
|
||||||
void clds_do(CLDClosure* strong_clds, CLDClosure* weak_clds, uint worker_id);
|
void always_strong_cld_do(CLDClosure* clds, uint worker_id);
|
||||||
|
void cld_do(CLDClosure* clds, uint worker_id);
|
||||||
};
|
};
|
||||||
|
|
||||||
class ShenandoahRootProcessor : public StackObj {
|
class ShenandoahRootProcessor : public StackObj {
|
||||||
|
|
|
@ -63,16 +63,28 @@ ShenandoahClassLoaderDataRoots<SINGLE_THREADED>::ShenandoahClassLoaderDataRoots(
|
||||||
}
|
}
|
||||||
|
|
||||||
template <bool SINGLE_THREADED>
|
template <bool SINGLE_THREADED>
|
||||||
void ShenandoahClassLoaderDataRoots<SINGLE_THREADED>::clds_do(CLDClosure* strong_clds, CLDClosure* weak_clds, uint worker_id) {
|
void ShenandoahClassLoaderDataRoots<SINGLE_THREADED>::always_strong_cld_do(CLDClosure* clds, uint worker_id) {
|
||||||
if (SINGLE_THREADED) {
|
if (SINGLE_THREADED) {
|
||||||
assert(SafepointSynchronize::is_at_safepoint(), "Must be at a safepoint");
|
assert(SafepointSynchronize::is_at_safepoint(), "Must be at a safepoint");
|
||||||
assert(Thread::current()->is_VM_thread(), "Single threaded CLDG iteration can only be done by VM thread");
|
assert(Thread::current()->is_VM_thread(), "Single threaded CLDG iteration can only be done by VM thread");
|
||||||
|
ClassLoaderDataGraph::always_strong_cld_do(clds);
|
||||||
ClassLoaderDataGraph::roots_cld_do(strong_clds, weak_clds);
|
|
||||||
} else {
|
} else {
|
||||||
ShenandoahWorkerTimings* worker_times = ShenandoahHeap::heap()->phase_timings()->worker_times();
|
ShenandoahWorkerTimings* worker_times = ShenandoahHeap::heap()->phase_timings()->worker_times();
|
||||||
ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::CLDGRoots, worker_id);
|
ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::CLDGRoots, worker_id);
|
||||||
ClassLoaderDataGraph::roots_cld_do(strong_clds, weak_clds);
|
ClassLoaderDataGraph::always_strong_cld_do(clds);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <bool SINGLE_THREADED>
|
||||||
|
void ShenandoahClassLoaderDataRoots<SINGLE_THREADED>::cld_do(CLDClosure* clds, uint worker_id) {
|
||||||
|
if (SINGLE_THREADED) {
|
||||||
|
assert(SafepointSynchronize::is_at_safepoint(), "Must be at a safepoint");
|
||||||
|
assert(Thread::current()->is_VM_thread(), "Single threaded CLDG iteration can only be done by VM thread");
|
||||||
|
ClassLoaderDataGraph::cld_do(clds);
|
||||||
|
} else {
|
||||||
|
ShenandoahWorkerTimings* worker_times = ShenandoahHeap::heap()->phase_timings()->worker_times();
|
||||||
|
ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::CLDGRoots, worker_id);
|
||||||
|
ClassLoaderDataGraph::cld_do(clds);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -141,7 +153,13 @@ void ShenandoahRootScanner<ITR>::roots_do(uint worker_id, OopClosure* oops, CLDC
|
||||||
|
|
||||||
_serial_roots.oops_do(oops, worker_id);
|
_serial_roots.oops_do(oops, worker_id);
|
||||||
_jni_roots.oops_do(oops, worker_id);
|
_jni_roots.oops_do(oops, worker_id);
|
||||||
_cld_roots.clds_do(clds, clds, worker_id);
|
|
||||||
|
if (clds != NULL) {
|
||||||
|
_cld_roots.cld_do(clds, worker_id);
|
||||||
|
} else {
|
||||||
|
assert(ShenandoahHeap::heap()->is_concurrent_traversal_in_progress(), "Only possible with traversal GC");
|
||||||
|
}
|
||||||
|
|
||||||
_thread_roots.threads_do(&tc_cl, worker_id);
|
_thread_roots.threads_do(&tc_cl, worker_id);
|
||||||
|
|
||||||
// With ShenandoahConcurrentScanCodeRoots, we avoid scanning the entire code cache here,
|
// With ShenandoahConcurrentScanCodeRoots, we avoid scanning the entire code cache here,
|
||||||
|
@ -160,7 +178,7 @@ void ShenandoahRootScanner<ITR>::strong_roots_do(uint worker_id, OopClosure* oop
|
||||||
|
|
||||||
_serial_roots.oops_do(oops, worker_id);
|
_serial_roots.oops_do(oops, worker_id);
|
||||||
_jni_roots.oops_do(oops, worker_id);
|
_jni_roots.oops_do(oops, worker_id);
|
||||||
_cld_roots.clds_do(clds, NULL, worker_id);
|
_cld_roots.always_strong_cld_do(clds, worker_id);
|
||||||
_thread_roots.threads_do(&tc_cl, worker_id);
|
_thread_roots.threads_do(&tc_cl, worker_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -168,13 +186,12 @@ template <typename IsAlive, typename KeepAlive>
|
||||||
void ShenandoahRootUpdater::roots_do(uint worker_id, IsAlive* is_alive, KeepAlive* keep_alive) {
|
void ShenandoahRootUpdater::roots_do(uint worker_id, IsAlive* is_alive, KeepAlive* keep_alive) {
|
||||||
CodeBlobToOopClosure update_blobs(keep_alive, CodeBlobToOopClosure::FixRelocations);
|
CodeBlobToOopClosure update_blobs(keep_alive, CodeBlobToOopClosure::FixRelocations);
|
||||||
CLDToOopClosure clds(keep_alive, ClassLoaderData::_claim_strong);
|
CLDToOopClosure clds(keep_alive, ClassLoaderData::_claim_strong);
|
||||||
CLDToOopClosure* weak_clds = ShenandoahHeap::heap()->unload_classes() ? NULL : &clds;
|
|
||||||
|
|
||||||
_serial_roots.oops_do(keep_alive, worker_id);
|
_serial_roots.oops_do(keep_alive, worker_id);
|
||||||
_jni_roots.oops_do(keep_alive, worker_id);
|
_jni_roots.oops_do(keep_alive, worker_id);
|
||||||
|
|
||||||
_thread_roots.oops_do(keep_alive, NULL, worker_id);
|
_thread_roots.oops_do(keep_alive, NULL, worker_id);
|
||||||
_cld_roots.clds_do(&clds, weak_clds, worker_id);
|
_cld_roots.cld_do(&clds, worker_id);
|
||||||
|
|
||||||
if(_update_code_cache) {
|
if(_update_code_cache) {
|
||||||
_code_roots.code_blobs_do(&update_blobs, worker_id);
|
_code_roots.code_blobs_do(&update_blobs, worker_id);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue