< 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 >