--- old/src/share/vm/gc_implementation/parNew/parCardTableModRefBS.cpp 2015-05-13 14:05:32.157074678 +0200 +++ new/src/share/vm/gc_implementation/parNew/parCardTableModRefBS.cpp 2015-05-13 14:05:32.049071087 +0200 @@ -39,16 +39,10 @@ void CardTableModRefBS::non_clean_card_iterate_parallel_work(Space* sp, MemRegion mr, OopsInGenClosure* cl, CardTableRS* ct, - int n_threads) { + uint n_threads) { assert(n_threads > 0, "Error: expected n_threads > 0"); - assert((n_threads == 1 && ParallelGCThreads == 0) || - n_threads <= (int)ParallelGCThreads, - "# worker threads != # requested!"); - assert(!Thread::current()->is_VM_thread() || (n_threads == 1), "There is only 1 VM thread"); - assert(UseDynamicNumberOfGCThreads || - !FLAG_IS_DEFAULT(ParallelGCThreads) || - n_threads == (int)ParallelGCThreads, - "# worker threads != # requested!"); + assert(n_threads <= (uint)ParallelGCThreads, "# worker threads != # requested!"); + // Make sure the LNC array is valid for the space. jbyte** lowest_non_clean; uintptr_t lowest_non_clean_base_chunk_index; @@ -64,9 +58,13 @@ pst->set_n_threads(n_threads); pst->set_n_tasks(n_strides); + bool parallel = n_threads > 0; + uint stride = 0; while (!pst->is_task_claimed(/* reference */ stride)) { - process_stride(sp, mr, stride, n_strides, cl, ct, + process_stride(sp, mr, stride, n_strides, + parallel, + cl, ct, lowest_non_clean, lowest_non_clean_base_chunk_index, lowest_non_clean_chunk_size); @@ -89,6 +87,7 @@ process_stride(Space* sp, MemRegion used, jint stride, int n_strides, + bool parallel, OopsInGenClosure* cl, CardTableRS* ct, jbyte** lowest_non_clean, @@ -133,8 +132,9 @@ assert(used.contains(chunk_mr), "chunk_mr should be subset of used"); DirtyCardToOopClosure* dcto_cl = sp->new_dcto_cl(cl, precision(), - cl->gen_boundary()); - ClearNoncleanCardWrapper clear_cl(dcto_cl, ct); + cl->gen_boundary(), + parallel); + ClearNoncleanCardWrapper clear_cl(dcto_cl, ct, parallel); // Process the chunk.