< prev index next >
src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.cpp
Print this page
rev 52753 : [backport] 8221435: Shenandoah should not mark through weak roots
Reviewed-by: rkennke, shade
rev 52754 : [backport] 8221629: Shenandoah: Cleanup class unloading logic
Reviewed-by: rkennke
*** 74,129 ****
ClassLoaderDataGraph::cld_do(&clds);
Universe::oops_do(oops);
Management::oops_do(oops);
JvmtiExport::oops_do(oops);
JNIHandles::oops_do(oops);
- WeakProcessor::oops_do(oops);
ObjectSynchronizer::oops_do(oops);
SystemDictionary::oops_do(oops);
StringTable::oops_do(oops);
- if (ShenandoahStringDedup::is_enabled()) {
- ShenandoahStringDedup::oops_do_slow(oops);
- }
-
// Do thread roots the last. This allows verification code to find
// any broken objects from those special roots first, not the accidental
// dangling reference from the thread root.
Threads::possibly_parallel_oops_do(false, oops, &blobs);
}
void ShenandoahRootProcessor::process_strong_roots(OopClosure* oops,
- OopClosure* weak_oops,
CLDClosure* clds,
- CLDClosure* weak_clds,
CodeBlobClosure* blobs,
ThreadClosure* thread_cl,
uint worker_id) {
! process_java_roots(oops, clds, weak_clds, blobs, thread_cl, worker_id);
! process_vm_roots(oops, NULL, weak_oops, worker_id);
_process_strong_tasks->all_tasks_completed(n_workers());
}
void ShenandoahRootProcessor::process_all_roots(OopClosure* oops,
- OopClosure* weak_oops,
CLDClosure* clds,
CodeBlobClosure* blobs,
ThreadClosure* thread_cl,
uint worker_id) {
ShenandoahWorkerTimings* worker_times = ShenandoahHeap::heap()->phase_timings()->worker_times();
process_java_roots(oops, clds, clds, blobs, thread_cl, worker_id);
! process_vm_roots(oops, oops, weak_oops, worker_id);
if (blobs != NULL) {
ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::CodeCacheRoots, worker_id);
_coderoots_all_iterator.possibly_parallel_blobs_do(blobs);
}
_process_strong_tasks->all_tasks_completed(n_workers());
}
class ShenandoahParallelOopsDoThreadClosure : public ThreadClosure {
private:
OopClosure* _f;
--- 74,129 ----
ClassLoaderDataGraph::cld_do(&clds);
Universe::oops_do(oops);
Management::oops_do(oops);
JvmtiExport::oops_do(oops);
JNIHandles::oops_do(oops);
ObjectSynchronizer::oops_do(oops);
SystemDictionary::oops_do(oops);
StringTable::oops_do(oops);
// Do thread roots the last. This allows verification code to find
// any broken objects from those special roots first, not the accidental
// dangling reference from the thread root.
Threads::possibly_parallel_oops_do(false, oops, &blobs);
}
void ShenandoahRootProcessor::process_strong_roots(OopClosure* oops,
CLDClosure* clds,
CodeBlobClosure* blobs,
ThreadClosure* thread_cl,
uint worker_id) {
! process_java_roots(oops, clds, NULL, blobs, thread_cl, worker_id);
! process_vm_roots(oops, worker_id);
_process_strong_tasks->all_tasks_completed(n_workers());
}
void ShenandoahRootProcessor::process_all_roots(OopClosure* oops,
CLDClosure* clds,
CodeBlobClosure* blobs,
ThreadClosure* thread_cl,
uint worker_id) {
ShenandoahWorkerTimings* worker_times = ShenandoahHeap::heap()->phase_timings()->worker_times();
process_java_roots(oops, clds, clds, blobs, thread_cl, worker_id);
! process_vm_roots(oops, worker_id);
if (blobs != NULL) {
ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::CodeCacheRoots, worker_id);
_coderoots_all_iterator.possibly_parallel_blobs_do(blobs);
}
+ // All threads execute the following. A specific chunk of buckets
+ // from the StringTable are the individual tasks.
+ {
+ ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::StringTableRoots, worker_id);
+ StringTable::possibly_parallel_oops_do(&_par_state_string, oops);
+ }
+
_process_strong_tasks->all_tasks_completed(n_workers());
+
}
class ShenandoahParallelOopsDoThreadClosure : public ThreadClosure {
private:
OopClosure* _f;
*** 165,178 ****
Threads::possibly_parallel_threads_do(is_par, &cl);
}
}
void ShenandoahRootProcessor::process_vm_roots(OopClosure* strong_roots,
! OopClosure* weak_roots,
! OopClosure* jni_weak_roots,
! uint worker_id)
! {
ShenandoahWorkerTimings* worker_times = ShenandoahHeap::heap()->phase_timings()->worker_times();
if (!_process_strong_tasks->is_task_claimed(SHENANDOAH_RP_PS_Universe_oops_do)) {
ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::UniverseRoots, worker_id);
Universe::oops_do(strong_roots);
}
--- 165,175 ----
Threads::possibly_parallel_threads_do(is_par, &cl);
}
}
void ShenandoahRootProcessor::process_vm_roots(OopClosure* strong_roots,
! uint worker_id) {
ShenandoahWorkerTimings* worker_times = ShenandoahHeap::heap()->phase_timings()->worker_times();
if (!_process_strong_tasks->is_task_claimed(SHENANDOAH_RP_PS_Universe_oops_do)) {
ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::UniverseRoots, worker_id);
Universe::oops_do(strong_roots);
}
*** 191,224 ****
}
if (!_process_strong_tasks->is_task_claimed(SHENANDOAH_RP_PS_SystemDictionary_oops_do)) {
ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::SystemDictionaryRoots, worker_id);
SystemDictionary::oops_do(strong_roots);
}
- if (jni_weak_roots != NULL) {
- if (!_process_strong_tasks->is_task_claimed(SHENANDOAH_RP_PS_JNIHandles_weak_oops_do)) {
- ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::JNIWeakRoots, worker_id);
- WeakProcessor::oops_do(jni_weak_roots);
- }
- }
-
- if (ShenandoahStringDedup::is_enabled() && weak_roots != NULL) {
- ShenandoahStringDedup::parallel_oops_do(weak_roots, worker_id);
- }
{
ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::ObjectSynchronizerRoots, worker_id);
if (!_process_strong_tasks->is_task_claimed(SHENANDOAH_RP_PS_ObjectSynchronizer_oops_do)) {
ObjectSynchronizer::oops_do(strong_roots);
}
}
-
- // All threads execute the following. A specific chunk of buckets
- // from the StringTable are the individual tasks.
- if (weak_roots != NULL) {
- ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::StringTableRoots, worker_id);
- StringTable::possibly_parallel_oops_do(&_par_state_string, weak_roots);
- }
}
uint ShenandoahRootProcessor::n_workers() const {
return _srs.n_threads();
}
--- 188,204 ----
< prev index next >