160 *entry = CardTableRS::clean_card_val(); |
160 *entry = CardTableRS::clean_card_val(); |
161 return true; |
161 return true; |
162 } |
162 } |
163 |
163 |
164 ClearNoncleanCardWrapper::ClearNoncleanCardWrapper( |
164 ClearNoncleanCardWrapper::ClearNoncleanCardWrapper( |
165 MemRegionClosure* dirty_card_closure, CardTableRS* ct) : |
165 DirtyCardToOopClosure* dirty_card_closure, CardTableRS* ct) : |
166 _dirty_card_closure(dirty_card_closure), _ct(ct) { |
166 _dirty_card_closure(dirty_card_closure), _ct(ct) { |
167 _is_par = (SharedHeap::heap()->n_par_threads() > 0); |
167 _is_par = (SharedHeap::heap()->n_par_threads() > 0); |
168 } |
168 } |
169 |
169 |
170 void ClearNoncleanCardWrapper::do_MemRegion(MemRegion mr) { |
170 void ClearNoncleanCardWrapper::do_MemRegion(MemRegion mr) { |
244 } while (true); |
244 } while (true); |
245 } |
245 } |
246 |
246 |
247 void CardTableRS::younger_refs_in_space_iterate(Space* sp, |
247 void CardTableRS::younger_refs_in_space_iterate(Space* sp, |
248 OopsInGenClosure* cl) { |
248 OopsInGenClosure* cl) { |
249 DirtyCardToOopClosure* dcto_cl = sp->new_dcto_cl(cl, _ct_bs->precision(), |
|
250 cl->gen_boundary()); |
|
251 ClearNoncleanCardWrapper clear_cl(dcto_cl, this); |
|
252 |
|
253 const MemRegion urasm = sp->used_region_at_save_marks(); |
249 const MemRegion urasm = sp->used_region_at_save_marks(); |
254 #ifdef ASSERT |
250 #ifdef ASSERT |
255 // Convert the assertion check to a warning if we are running |
251 // Convert the assertion check to a warning if we are running |
256 // CMS+ParNew until related bug is fixed. |
252 // CMS+ParNew until related bug is fixed. |
257 MemRegion ur = sp->used_region(); |
253 MemRegion ur = sp->used_region(); |
273 warning("CMS+ParNew: Flickering used_region()!!"); |
269 warning("CMS+ParNew: Flickering used_region()!!"); |
274 } |
270 } |
275 if (!urasm.equals(urasm2)) { |
271 if (!urasm.equals(urasm2)) { |
276 warning("CMS+ParNew: Flickering used_region_at_save_marks()!!"); |
272 warning("CMS+ParNew: Flickering used_region_at_save_marks()!!"); |
277 } |
273 } |
|
274 ShouldNotReachHere(); |
278 } |
275 } |
279 #endif |
276 #endif |
280 _ct_bs->non_clean_card_iterate_possibly_parallel(sp, urasm, |
277 _ct_bs->non_clean_card_iterate_possibly_parallel(sp, urasm, cl, this); |
281 dcto_cl, &clear_cl); |
|
282 } |
278 } |
283 |
279 |
284 void CardTableRS::clear_into_younger(Generation* gen, bool clear_perm) { |
280 void CardTableRS::clear_into_younger(Generation* gen, bool clear_perm) { |
285 GenCollectedHeap* gch = GenCollectedHeap::heap(); |
281 GenCollectedHeap* gch = GenCollectedHeap::heap(); |
286 // Generations younger than gen have been evacuated. We can clear |
282 // Generations younger than gen have been evacuated. We can clear |