diff --git a/src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.hpp b/src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.hpp index 5cb9bd09c39..e8e0d6056b6 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.hpp @@ -50,10 +50,10 @@ private: inline void do_task(ShenandoahObjToScanQueue* q, T* cl, ShenandoahLiveData* live_data, ShenandoahMarkTask* task); template - inline void do_chunked_array_start(ShenandoahObjToScanQueue* q, T* cl, oop array); + inline void do_chunked_array_start(ShenandoahObjToScanQueue* q, T* cl, oop array, bool strong); template - inline void do_chunked_array(ShenandoahObjToScanQueue* q, T* cl, oop array, int chunk, int pow); + inline void do_chunked_array(ShenandoahObjToScanQueue* q, T* cl, oop array, int chunk, int pow, bool strong); inline void count_liveness(ShenandoahLiveData* live_data, oop obj); diff --git a/src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.inline.hpp b/src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.inline.hpp index 8e0f1c8f3a3..7511f44f1e3 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.inline.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.inline.hpp @@ -45,7 +45,8 @@ void ShenandoahConcurrentMark::do_task(ShenandoahObjToScanQueue* q, T* cl, Shena shenandoah_assert_marked(NULL, obj); shenandoah_assert_not_in_cset_except(NULL, obj, _heap->cancelled_gc()); - cl->set_strong(task->is_strong()); + bool strong = task->is_strong(); + cl->set_strong(strong); if (task->is_not_chunked()) { if (obj->is_instance()) { // Case 1: Normal oop, process as usual. @@ -53,7 +54,7 @@ void ShenandoahConcurrentMark::do_task(ShenandoahObjToScanQueue* q, T* cl, Shena } else if (obj->is_objArray()) { // Case 2: Object array instance and no chunk is set. Must be the first // time we visit it, start the chunked processing. - do_chunked_array_start(q, cl, obj); + do_chunked_array_start(q, cl, obj, strong); } else { // Case 3: Primitive array. Do nothing, no oops there. We use the same // performance tweak TypeArrayKlass::oop_oop_iterate_impl is using: @@ -69,7 +70,7 @@ void ShenandoahConcurrentMark::do_task(ShenandoahObjToScanQueue* q, T* cl, Shena } } else { // Case 4: Array chunk, has sensible chunk id. Process it. - do_chunked_array(q, cl, obj, task->chunk(), task->pow()); + do_chunked_array(q, cl, obj, task->chunk(), task->pow(), strong); } } @@ -103,7 +104,7 @@ inline void ShenandoahConcurrentMark::count_liveness(ShenandoahLiveData* live_da } template -inline void ShenandoahConcurrentMark::do_chunked_array_start(ShenandoahObjToScanQueue* q, T* cl, oop obj) { +inline void ShenandoahConcurrentMark::do_chunked_array_start(ShenandoahObjToScanQueue* q, T* cl, oop obj, bool strong) { assert(obj->is_objArray(), "expect object array"); objArrayOop array = objArrayOop(obj); int len = array->length(); @@ -134,7 +135,7 @@ inline void ShenandoahConcurrentMark::do_chunked_array_start(ShenandoahObjToScan pow--; chunk = 2; last_idx = (1 << pow); - bool pushed = q->push(ShenandoahMarkTask(array, false, false, 1, pow)); + bool pushed = q->push(ShenandoahMarkTask(array, false, strong, 1, pow)); assert(pushed, "overflow queue should always succeed pushing"); } @@ -147,7 +148,7 @@ inline void ShenandoahConcurrentMark::do_chunked_array_start(ShenandoahObjToScan int right_chunk = chunk*2; int left_chunk_end = left_chunk * (1 << pow); if (left_chunk_end < len) { - bool pushed = q->push(ShenandoahMarkTask(array, false, false, left_chunk, pow)); + bool pushed = q->push(ShenandoahMarkTask(array, false, strong, left_chunk, pow)); assert(pushed, "overflow queue should always succeed pushing"); chunk = right_chunk; last_idx = left_chunk_end; @@ -165,7 +166,7 @@ inline void ShenandoahConcurrentMark::do_chunked_array_start(ShenandoahObjToScan } template -inline void ShenandoahConcurrentMark::do_chunked_array(ShenandoahObjToScanQueue* q, T* cl, oop obj, int chunk, int pow) { +inline void ShenandoahConcurrentMark::do_chunked_array(ShenandoahObjToScanQueue* q, T* cl, oop obj, int chunk, int pow, bool strong) { assert(obj->is_objArray(), "expect object array"); objArrayOop array = objArrayOop(obj); @@ -176,7 +177,7 @@ inline void ShenandoahConcurrentMark::do_chunked_array(ShenandoahObjToScanQueue* while ((1 << pow) > (int)ObjArrayMarkingStride && (chunk*2 < ShenandoahMarkTask::chunk_size())) { pow--; chunk *= 2; - bool pushed = q->push(ShenandoahMarkTask(array, false, false, chunk - 1, pow)); + bool pushed = q->push(ShenandoahMarkTask(array, false, strong, chunk - 1, pow)); assert(pushed, "overflow queue should always succeed pushing"); }