< prev index next >
src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp
Print this page
rev 52371 : [mq]: lvb.patch
*** 382,392 ****
--- 382,396 ----
_alloc_seq_at_last_gc_end(0),
_used_at_last_gc(0) {
log_info(gc, init)("GC threads: " UINT32_FORMAT " parallel, " UINT32_FORMAT " concurrent", ParallelGCThreads, ConcGCThreads);
log_info(gc, init)("Reference processing: %s", ParallelRefProcEnabled ? "parallel" : "serial");
+ if (ShenandoahLoadRefBarrier) {
+ BarrierSet::set_barrier_set(new ShenandoahLRBBarrierSet(this));
+ } else {
BarrierSet::set_barrier_set(new ShenandoahBarrierSet(this));
+ }
_max_workers = MAX2(_max_workers, 1U);
_workers = new ShenandoahWorkGang("Shenandoah GC Threads", _max_workers,
/* are_GC_task_threads */true,
/* are_ConcurrentGC_threads */false);
*** 1124,1133 ****
--- 1128,1157 ----
MarkingCodeBlobClosure blobsCl(&cl, CodeBlobToOopClosure::FixRelocations);
_rp->process_evacuate_roots(&cl, &blobsCl, worker_id);
}
};
+ class ShenandoahEvacuateUpdateAllRootsTask : public AbstractGangTask {
+ ShenandoahRootProcessor* _rp;
+ public:
+
+ ShenandoahEvacuateUpdateAllRootsTask(ShenandoahRootProcessor* rp) :
+ AbstractGangTask("Shenandoah evacuate and update all roots"),
+ _rp(rp) {
+ // Nothing else to do.
+ }
+
+ void work(uint worker_id) {
+ ShenandoahEvacOOMScope oom_evac_scope;
+ ShenandoahEvacuateUpdateRootsClosure cl;
+ CLDToOopClosure cldCl(&cl);
+ // MarkingCodeBlobClosure blobsCl(&cl, CodeBlobToOopClosure::FixRelocations);
+ CodeBlobToOopClosure blobsCl(&cl, CodeBlobToOopClosure::FixRelocations);
+ _rp->process_all_roots(&cl, &cl, &cldCl, &blobsCl, NULL, worker_id);
+ }
+ };
+
class ShenandoahFixRootsTask : public AbstractGangTask {
ShenandoahRootEvacuator* _rp;
public:
ShenandoahFixRootsTask(ShenandoahRootEvacuator* rp) :
*** 1145,1162 ****
_rp->process_evacuate_roots(&cl, &blobsCl, worker_id);
}
};
void ShenandoahHeap::evacuate_and_update_roots() {
#if defined(COMPILER2) || INCLUDE_JVMCI
DerivedPointerTable::clear();
#endif
assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "Only iterate roots while world is stopped");
! {
ShenandoahRootEvacuator rp(this, workers()->active_workers(), ShenandoahPhaseTimings::init_evac);
ShenandoahEvacuateUpdateRootsTask roots_task(&rp);
workers()->run_task(&roots_task);
}
--- 1169,1210 ----
_rp->process_evacuate_roots(&cl, &blobsCl, worker_id);
}
};
+ class ShenandoahFixAllRootsTask : public AbstractGangTask {
+ ShenandoahRootProcessor* _rp;
+ public:
+
+ ShenandoahFixAllRootsTask(ShenandoahRootProcessor* rp) :
+ AbstractGangTask("Shenandoah update all roots"),
+ _rp(rp)
+ {
+ // Nothing else to do.
+ }
+
+ void work(uint worker_id) {
+ ShenandoahEvacOOMScope oom_evac_scope;
+ ShenandoahUpdateRefsClosure cl;
+ CLDToOopClosure cldCl(&cl);
+ MarkingCodeBlobClosure blobsCl(&cl, CodeBlobToOopClosure::FixRelocations);
+ _rp->process_all_roots(&cl, &cl, &cldCl, &blobsCl, NULL, worker_id);
+ }
+ };
+
void ShenandoahHeap::evacuate_and_update_roots() {
#if defined(COMPILER2) || INCLUDE_JVMCI
DerivedPointerTable::clear();
#endif
assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "Only iterate roots while world is stopped");
! if (ShenandoahLoadRefBarrier) {
! ShenandoahRootProcessor rp(this, workers()->active_workers(), ShenandoahPhaseTimings::init_evac);
! ShenandoahEvacuateUpdateAllRootsTask roots_task(&rp);
! workers()->run_task(&roots_task);
! } else {
ShenandoahRootEvacuator rp(this, workers()->active_workers(), ShenandoahPhaseTimings::init_evac);
ShenandoahEvacuateUpdateRootsTask roots_task(&rp);
workers()->run_task(&roots_task);
}
*** 1179,1191 ****
--- 1227,1245 ----
// clear() and update_pointers() must always be called in pairs,
// cannot nest with above clear()/update_pointers().
#if defined(COMPILER2) || INCLUDE_JVMCI
DerivedPointerTable::clear();
#endif
+ if (ShenandoahLoadRefBarrier) {
+ ShenandoahRootProcessor rp(this, workers()->active_workers(), ShenandoahPhaseTimings::init_evac);
+ ShenandoahFixAllRootsTask update_roots_task(&rp);
+ workers()->run_task(&update_roots_task);
+ } else {
ShenandoahRootEvacuator rp(this, workers()->active_workers(), ShenandoahPhaseTimings::init_evac);
ShenandoahFixRootsTask update_roots_task(&rp);
workers()->run_task(&update_roots_task);
+ }
#if defined(COMPILER2) || INCLUDE_JVMCI
DerivedPointerTable::update_pointers();
#endif
}
< prev index next >