--- old/src/hotspot/share/gc/shenandoah/shenandoahTraversalGC.cpp 2018-07-17 22:23:38.582454801 +0200 +++ new/src/hotspot/share/gc/shenandoah/shenandoahTraversalGC.cpp 2018-07-17 22:23:38.395458048 +0200 @@ -839,15 +839,18 @@ ShenandoahObjToScanQueue* _queue; Thread* _thread; ShenandoahTraversalGC* _traversal_gc; + ShenandoahMarkingContext* const _mark_context; + template inline void do_oop_work(T* p) { - _traversal_gc->process_oop(p, _thread, _queue, NULL); + _traversal_gc->process_oop(p, _thread, _queue, _mark_context, NULL); } public: ShenandoahTraversalKeepAliveUpdateClosure(ShenandoahObjToScanQueue* q) : _queue(q), _thread(Thread::current()), - _traversal_gc(ShenandoahHeap::heap()->traversal_gc()) {} + _traversal_gc(ShenandoahHeap::heap()->traversal_gc()), + _mark_context(ShenandoahHeap::heap()->next_marking_context()) {} void do_oop(narrowOop* p) { do_oop_work(p); } void do_oop(oop* p) { do_oop_work(p); } @@ -858,15 +861,18 @@ ShenandoahObjToScanQueue* _queue; Thread* _thread; ShenandoahTraversalGC* _traversal_gc; + ShenandoahMarkingContext* const _mark_context; + template inline void do_oop_work(T* p) { - _traversal_gc->process_oop(p, _thread, _queue, NULL); + _traversal_gc->process_oop(p, _thread, _queue, _mark_context, NULL); } public: ShenandoahTraversalKeepAliveUpdateDegenClosure(ShenandoahObjToScanQueue* q) : _queue(q), _thread(Thread::current()), - _traversal_gc(ShenandoahHeap::heap()->traversal_gc()) {} + _traversal_gc(ShenandoahHeap::heap()->traversal_gc()), + _mark_context(ShenandoahHeap::heap()->next_marking_context()) {} void do_oop(narrowOop* p) { do_oop_work(p); } void do_oop(oop* p) { do_oop_work(p); } @@ -877,16 +883,19 @@ ShenandoahObjToScanQueue* _queue; Thread* _thread; ShenandoahTraversalGC* _traversal_gc; + ShenandoahMarkingContext* const _mark_context; + template inline void do_oop_work(T* p) { // TODO: Need to somehow pass base_obj here? - _traversal_gc->process_oop(p, _thread, _queue, NULL); + _traversal_gc->process_oop(p, _thread, _queue, _mark_context, NULL); } public: ShenandoahTraversalKeepAliveUpdateMatrixClosure(ShenandoahObjToScanQueue* q) : _queue(q), _thread(Thread::current()), - _traversal_gc(ShenandoahHeap::heap()->traversal_gc()) {} + _traversal_gc(ShenandoahHeap::heap()->traversal_gc()), + _mark_context(ShenandoahHeap::heap()->next_marking_context()) {} void do_oop(narrowOop* p) { do_oop_work(p); } void do_oop(oop* p) { do_oop_work(p); } @@ -897,16 +906,19 @@ ShenandoahObjToScanQueue* _queue; Thread* _thread; ShenandoahTraversalGC* _traversal_gc; + ShenandoahMarkingContext* const _mark_context; + template inline void do_oop_work(T* p) { // TODO: Need to somehow pass base_obj here? - _traversal_gc->process_oop(p, _thread, _queue, NULL); + _traversal_gc->process_oop(p, _thread, _queue, _mark_context, NULL); } public: ShenandoahTraversalKeepAliveUpdateDegenMatrixClosure(ShenandoahObjToScanQueue* q) : _queue(q), _thread(Thread::current()), - _traversal_gc(ShenandoahHeap::heap()->traversal_gc()) {} + _traversal_gc(ShenandoahHeap::heap()->traversal_gc()), + _mark_context(ShenandoahHeap::heap()->next_marking_context()) {} void do_oop(narrowOop* p) { do_oop_work(p); } void do_oop(oop* p) { do_oop_work(p); }