189 // dirty ==> cur_youngergen_and_prev_nonclean_card |
189 // dirty ==> cur_youngergen_and_prev_nonclean_card |
190 // precleaned ==> cur_youngergen_and_prev_nonclean_card |
190 // precleaned ==> cur_youngergen_and_prev_nonclean_card |
191 // prev-younger-gen ==> cur_youngergen_and_prev_nonclean_card |
191 // prev-younger-gen ==> cur_youngergen_and_prev_nonclean_card |
192 // cur-younger-gen ==> cur_younger_gen |
192 // cur-younger-gen ==> cur_younger_gen |
193 // cur_youngergen_and_prev_nonclean_card ==> no change. |
193 // cur_youngergen_and_prev_nonclean_card ==> no change. |
194 void CardTableRS::write_ref_field_gc_par(oop* field, oop new_val) { |
194 void CardTableRS::write_ref_field_gc_par(void* field, oop new_val) { |
195 jbyte* entry = ct_bs()->byte_for(field); |
195 jbyte* entry = ct_bs()->byte_for(field); |
196 do { |
196 do { |
197 jbyte entry_val = *entry; |
197 jbyte entry_val = *entry; |
198 // We put this first because it's probably the most common case. |
198 // We put this first because it's probably the most common case. |
199 if (entry_val == clean_card_val()) { |
199 if (entry_val == clean_card_val()) { |
288 } |
288 } |
289 } |
289 } |
290 |
290 |
291 |
291 |
292 class VerifyCleanCardClosure: public OopClosure { |
292 class VerifyCleanCardClosure: public OopClosure { |
293 HeapWord* boundary; |
293 private: |
294 HeapWord* begin; HeapWord* end; |
294 HeapWord* _boundary; |
|
295 HeapWord* _begin; |
|
296 HeapWord* _end; |
|
297 protected: |
|
298 template <class T> void do_oop_work(T* p) { |
|
299 HeapWord* jp = (HeapWord*)p; |
|
300 if (jp >= _begin && jp < _end) { |
|
301 oop obj = oopDesc::load_decode_heap_oop(p); |
|
302 guarantee(obj == NULL || |
|
303 (HeapWord*)p < _boundary || |
|
304 (HeapWord*)obj >= _boundary, |
|
305 "pointer on clean card crosses boundary"); |
|
306 } |
|
307 } |
295 public: |
308 public: |
296 void do_oop(oop* p) { |
309 VerifyCleanCardClosure(HeapWord* b, HeapWord* begin, HeapWord* end) : |
297 HeapWord* jp = (HeapWord*)p; |
310 _boundary(b), _begin(begin), _end(end) {} |
298 if (jp >= begin && jp < end) { |
311 virtual void do_oop(oop* p) { VerifyCleanCardClosure::do_oop_work(p); } |
299 guarantee(*p == NULL || (HeapWord*)p < boundary |
312 virtual void do_oop(narrowOop* p) { VerifyCleanCardClosure::do_oop_work(p); } |
300 || (HeapWord*)(*p) >= boundary, |
|
301 "pointer on clean card crosses boundary"); |
|
302 } |
|
303 } |
|
304 VerifyCleanCardClosure(HeapWord* b, HeapWord* _begin, HeapWord* _end) : |
|
305 boundary(b), begin(_begin), end(_end) {} |
|
306 }; |
313 }; |
307 |
314 |
308 class VerifyCTSpaceClosure: public SpaceClosure { |
315 class VerifyCTSpaceClosure: public SpaceClosure { |
|
316 private: |
309 CardTableRS* _ct; |
317 CardTableRS* _ct; |
310 HeapWord* _boundary; |
318 HeapWord* _boundary; |
311 public: |
319 public: |
312 VerifyCTSpaceClosure(CardTableRS* ct, HeapWord* boundary) : |
320 VerifyCTSpaceClosure(CardTableRS* ct, HeapWord* boundary) : |
313 _ct(ct), _boundary(boundary) {} |
321 _ct(ct), _boundary(boundary) {} |
314 void do_space(Space* s) { _ct->verify_space(s, _boundary); } |
322 virtual void do_space(Space* s) { _ct->verify_space(s, _boundary); } |
315 }; |
323 }; |
316 |
324 |
317 class VerifyCTGenClosure: public GenCollectedHeap::GenClosure { |
325 class VerifyCTGenClosure: public GenCollectedHeap::GenClosure { |
318 CardTableRS* _ct; |
326 CardTableRS* _ct; |
319 public: |
327 public: |