< prev index next >
src/share/vm/memory/cardTableModRefBS.cpp
Print this page
*** 438,481 ****
void CardTableModRefBS::non_clean_card_iterate_possibly_parallel(Space* sp,
MemRegion mr,
OopsInGenClosure* cl,
! CardTableRS* ct) {
if (!mr.is_empty()) {
! // Caller (process_roots()) claims that all GC threads
! // execute this call. With UseDynamicNumberOfGCThreads now all
! // active GC threads execute this call. The number of active GC
! // threads needs to be passed to par_non_clean_card_iterate_work()
! // to get proper partitioning and termination.
! //
! // This is an example of where n_par_threads() is used instead
! // of workers()->active_workers(). n_par_threads can be set to 0 to
! // turn off parallelism. For example when this code is called as
! // part of verification during root processing then n_par_threads()
! // may have been set to 0. active_workers is not overloaded with
! // the meaning that it is a switch to disable parallelism and so keeps
! // the meaning of the number of active gc workers. If parallelism has
! // not been shut off by setting n_par_threads to 0, then n_par_threads
! // should be equal to active_workers. When a different mechanism for
! // shutting off parallelism is used, then active_workers can be used in
! // place of n_par_threads.
! int n_threads = GenCollectedHeap::heap()->n_par_threads();
! bool is_par = n_threads > 0;
! if (is_par) {
#if INCLUDE_ALL_GCS
- assert(GenCollectedHeap::heap()->n_par_threads() ==
- GenCollectedHeap::heap()->workers()->active_workers(), "Mismatch");
non_clean_card_iterate_parallel_work(sp, mr, cl, ct, n_threads);
#else // INCLUDE_ALL_GCS
fatal("Parallel gc not supported here.");
#endif // INCLUDE_ALL_GCS
} else {
// clear_cl finds contiguous dirty ranges of cards to process and clear.
! DirtyCardToOopClosure* dcto_cl = sp->new_dcto_cl(cl, precision(), cl->gen_boundary());
! ClearNoncleanCardWrapper clear_cl(dcto_cl, ct);
clear_cl.do_MemRegion(mr);
}
}
}
--- 438,461 ----
void CardTableModRefBS::non_clean_card_iterate_possibly_parallel(Space* sp,
MemRegion mr,
OopsInGenClosure* cl,
! CardTableRS* ct,
! uint n_threads) {
if (!mr.is_empty()) {
! if (n_threads > 0) {
#if INCLUDE_ALL_GCS
non_clean_card_iterate_parallel_work(sp, mr, cl, ct, n_threads);
#else // INCLUDE_ALL_GCS
fatal("Parallel gc not supported here.");
#endif // INCLUDE_ALL_GCS
} else {
// clear_cl finds contiguous dirty ranges of cards to process and clear.
! DirtyCardToOopClosure* dcto_cl = sp->new_dcto_cl(cl, precision(), cl->gen_boundary(), false);
! ClearNoncleanCardWrapper clear_cl(dcto_cl, ct, false);
clear_cl.do_MemRegion(mr);
}
}
}
< prev index next >