< prev index next >
src/share/vm/gc/shenandoah/shenandoahRootProcessor.cpp
Print this page
rev 13387 : [mq]: parallel_sp_cleaning.patch
*** 29,66 ****
#include "gc/shenandoah/shenandoahRootProcessor.hpp"
#include "gc/shenandoah/shenandoahHeap.hpp"
#include "gc/shenandoah/shenandoahBarrierSet.hpp"
#include "gc/shenandoah/shenandoahCollectorPolicy.hpp"
#include "gc/shenandoah/shenandoahPhaseTimes.hpp"
#include "memory/allocation.inline.hpp"
#include "runtime/fprofiler.hpp"
#include "runtime/mutex.hpp"
#include "services/management.hpp"
ShenandoahRootProcessor::ShenandoahRootProcessor(ShenandoahHeap* heap, uint n_workers,
ShenandoahCollectorPolicy::TimingPhase phase) :
_process_strong_tasks(new SubTasksDone(SHENANDOAH_RP_PS_NumElements)),
_srs(n_workers),
_phase(phase),
_codecache_iterator(CodeCache::parallel_iterator()),
! _om_iterator(ObjectSynchronizer::parallel_iterator())
{
heap->shenandoahPolicy()->record_workers_start(_phase);
}
ShenandoahRootProcessor::~ShenandoahRootProcessor() {
delete _process_strong_tasks;
ShenandoahHeap::heap()->shenandoahPolicy()->record_workers_end(_phase);
}
void ShenandoahRootProcessor::process_strong_roots(OopClosure* oops,
OopClosure* weak_oops,
CLDClosure* clds,
CodeBlobClosure* blobs,
uint worker_id) {
! process_java_roots(oops, clds, NULL, blobs, worker_id);
process_vm_roots(oops, NULL, weak_oops, worker_id);
_process_strong_tasks->all_tasks_completed(n_workers());
}
--- 29,75 ----
#include "gc/shenandoah/shenandoahRootProcessor.hpp"
#include "gc/shenandoah/shenandoahHeap.hpp"
#include "gc/shenandoah/shenandoahBarrierSet.hpp"
#include "gc/shenandoah/shenandoahCollectorPolicy.hpp"
#include "gc/shenandoah/shenandoahPhaseTimes.hpp"
+ #include "gc/shenandoah/vm_operations_shenandoah.hpp"
#include "memory/allocation.inline.hpp"
#include "runtime/fprofiler.hpp"
#include "runtime/mutex.hpp"
+ #include "runtime/sweeper.hpp"
#include "services/management.hpp"
ShenandoahRootProcessor::ShenandoahRootProcessor(ShenandoahHeap* heap, uint n_workers,
ShenandoahCollectorPolicy::TimingPhase phase) :
_process_strong_tasks(new SubTasksDone(SHENANDOAH_RP_PS_NumElements)),
_srs(n_workers),
_phase(phase),
_codecache_iterator(CodeCache::parallel_iterator()),
! _om_iterator(ObjectSynchronizer::parallel_iterator()),
! _threads_nmethods_cl(NULL)
{
heap->shenandoahPolicy()->record_workers_start(_phase);
+ VM_ShenandoahOperation* op = (VM_ShenandoahOperation*) VMThread::vm_operation();
+ if (! op->_safepoint_cleanup_done) {
+ _threads_nmethods_cl = NMethodSweeper::prepare_mark_active_nmethods();
+ }
}
ShenandoahRootProcessor::~ShenandoahRootProcessor() {
delete _process_strong_tasks;
ShenandoahHeap::heap()->shenandoahPolicy()->record_workers_end(_phase);
+ VM_ShenandoahOperation* op = (VM_ShenandoahOperation*) VMThread::vm_operation();
+ op->_safepoint_cleanup_done = true;
}
void ShenandoahRootProcessor::process_strong_roots(OopClosure* oops,
OopClosure* weak_oops,
CLDClosure* clds,
CodeBlobClosure* blobs,
uint worker_id) {
! process_java_roots(oops, clds, NULL, NULL, _threads_nmethods_cl, worker_id);
process_vm_roots(oops, NULL, weak_oops, worker_id);
_process_strong_tasks->all_tasks_completed(n_workers());
}
*** 69,79 ****
CLDClosure* clds,
CodeBlobClosure* blobs,
uint worker_id) {
ShenandoahPhaseTimes* phase_times = ShenandoahHeap::heap()->shenandoahPolicy()->phase_times();
! process_java_roots(oops, clds, clds, NULL, worker_id);
process_vm_roots(oops, oops, weak_oops, worker_id);
if (blobs != NULL) {
ShenandoahParPhaseTimesTracker timer(phase_times, ShenandoahPhaseTimes::CodeCacheRoots, worker_id);
_codecache_iterator.parallel_blobs_do(blobs);
--- 78,88 ----
CLDClosure* clds,
CodeBlobClosure* blobs,
uint worker_id) {
ShenandoahPhaseTimes* phase_times = ShenandoahHeap::heap()->shenandoahPolicy()->phase_times();
! process_java_roots(oops, clds, clds, blobs, _threads_nmethods_cl, worker_id);
process_vm_roots(oops, oops, weak_oops, worker_id);
if (blobs != NULL) {
ShenandoahParPhaseTimesTracker timer(phase_times, ShenandoahPhaseTimes::CodeCacheRoots, worker_id);
_codecache_iterator.parallel_blobs_do(blobs);
*** 84,93 ****
--- 93,103 ----
void ShenandoahRootProcessor::process_java_roots(OopClosure* strong_roots,
CLDClosure* strong_clds,
CLDClosure* weak_clds,
CodeBlobClosure* strong_code,
+ CodeBlobClosure* nmethods_cl,
uint worker_id)
{
ShenandoahPhaseTimes* phase_times = ShenandoahHeap::heap()->shenandoahPolicy()->phase_times();
// Iterating over the CLDG and the Threads are done early to allow us to
// first process the strong CLDs and nmethods and then, after a barrier,
*** 99,109 ****
{
ShenandoahParPhaseTimesTracker timer(phase_times, ShenandoahPhaseTimes::ThreadRoots, worker_id);
bool is_par = n_workers() > 1;
ResourceMark rm;
! Threads::possibly_parallel_oops_do(is_par, strong_roots, strong_code);
}
}
void ShenandoahRootProcessor::process_vm_roots(OopClosure* strong_roots,
OopClosure* weak_roots,
--- 109,119 ----
{
ShenandoahParPhaseTimesTracker timer(phase_times, ShenandoahPhaseTimes::ThreadRoots, worker_id);
bool is_par = n_workers() > 1;
ResourceMark rm;
! Threads::possibly_parallel_oops_do(is_par, strong_roots, strong_code, nmethods_cl);
}
}
void ShenandoahRootProcessor::process_vm_roots(OopClosure* strong_roots,
OopClosure* weak_roots,
*** 168,185 ****
ShenandoahRootEvacuator::ShenandoahRootEvacuator(ShenandoahHeap* heap, uint n_workers, ShenandoahCollectorPolicy::TimingPhase phase) :
_process_strong_tasks(new SubTasksDone(SHENANDOAH_RP_PS_NumElements)),
_srs(n_workers),
_phase(phase),
! _codecache_iterator(CodeCache::parallel_iterator())
{
heap->shenandoahPolicy()->record_workers_start(_phase);
}
ShenandoahRootEvacuator::~ShenandoahRootEvacuator() {
delete _process_strong_tasks;
ShenandoahHeap::heap()->shenandoahPolicy()->record_workers_end(_phase);
}
void ShenandoahRootEvacuator::process_evacuate_roots(OopClosure* oops,
CodeBlobClosure* blobs,
uint worker_id) {
--- 178,202 ----
ShenandoahRootEvacuator::ShenandoahRootEvacuator(ShenandoahHeap* heap, uint n_workers, ShenandoahCollectorPolicy::TimingPhase phase) :
_process_strong_tasks(new SubTasksDone(SHENANDOAH_RP_PS_NumElements)),
_srs(n_workers),
_phase(phase),
! _codecache_iterator(CodeCache::parallel_iterator()),
! _threads_nmethods_cl(NULL)
{
heap->shenandoahPolicy()->record_workers_start(_phase);
+ VM_ShenandoahOperation* op = (VM_ShenandoahOperation*) VMThread::vm_operation();
+ if (! op->_safepoint_cleanup_done) {
+ _threads_nmethods_cl = NMethodSweeper::prepare_mark_active_nmethods();
+ }
}
ShenandoahRootEvacuator::~ShenandoahRootEvacuator() {
delete _process_strong_tasks;
ShenandoahHeap::heap()->shenandoahPolicy()->record_workers_end(_phase);
+ VM_ShenandoahOperation* op = (VM_ShenandoahOperation*) VMThread::vm_operation();
+ op->_safepoint_cleanup_done = true;
}
void ShenandoahRootEvacuator::process_evacuate_roots(OopClosure* oops,
CodeBlobClosure* blobs,
uint worker_id) {
*** 187,197 ****
ShenandoahPhaseTimes* phase_times = ShenandoahHeap::heap()->shenandoahPolicy()->phase_times();
{
bool is_par = n_workers() > 1;
ResourceMark rm;
ShenandoahParPhaseTimesTracker timer(phase_times, ShenandoahPhaseTimes::ThreadRoots, worker_id);
! Threads::possibly_parallel_oops_do(is_par, oops, NULL);
}
{
ShenandoahParPhaseTimesTracker timer(phase_times, ShenandoahPhaseTimes::CodeCacheRoots, worker_id);
_codecache_iterator.parallel_blobs_do(blobs);
--- 204,215 ----
ShenandoahPhaseTimes* phase_times = ShenandoahHeap::heap()->shenandoahPolicy()->phase_times();
{
bool is_par = n_workers() > 1;
ResourceMark rm;
ShenandoahParPhaseTimesTracker timer(phase_times, ShenandoahPhaseTimes::ThreadRoots, worker_id);
!
! Threads::possibly_parallel_oops_do(is_par, oops, NULL, _threads_nmethods_cl);
}
{
ShenandoahParPhaseTimesTracker timer(phase_times, ShenandoahPhaseTimes::CodeCacheRoots, worker_id);
_codecache_iterator.parallel_blobs_do(blobs);
< prev index next >