42 static bool |
42 static bool |
43 card_is_dirty_wrt_gen_iter(jbyte cv) { |
43 card_is_dirty_wrt_gen_iter(jbyte cv) { |
44 return CardTableModRefBS::card_is_dirty_wrt_gen_iter(cv); |
44 return CardTableModRefBS::card_is_dirty_wrt_gen_iter(cv); |
45 } |
45 } |
46 |
46 |
47 CardTableModRefBSForCTRS _ct_bs; |
47 CardTableModRefBSForCTRS* _ct_bs; |
48 |
48 |
49 virtual void younger_refs_in_space_iterate(Space* sp, OopsInGenClosure* cl); |
49 virtual void younger_refs_in_space_iterate(Space* sp, OopsInGenClosure* cl); |
50 |
50 |
51 void verify_space(Space* s, HeapWord* gen_start); |
51 void verify_space(Space* s, HeapWord* gen_start); |
52 |
52 |
71 // always have the value "clean_card".) |
71 // always have the value "clean_card".) |
72 jbyte* _last_cur_val_in_gen; |
72 jbyte* _last_cur_val_in_gen; |
73 |
73 |
74 jbyte _cur_youngergen_card_val; |
74 jbyte _cur_youngergen_card_val; |
75 |
75 |
|
76 int _regions_to_iterate; |
|
77 |
76 jbyte cur_youngergen_card_val() { |
78 jbyte cur_youngergen_card_val() { |
77 return _cur_youngergen_card_val; |
79 return _cur_youngergen_card_val; |
78 } |
80 } |
79 void set_cur_youngergen_card_val(jbyte v) { |
81 void set_cur_youngergen_card_val(jbyte v) { |
80 _cur_youngergen_card_val = v; |
82 _cur_youngergen_card_val = v; |
94 // *** GenRemSet functions. |
96 // *** GenRemSet functions. |
95 GenRemSet::Name rs_kind() { return GenRemSet::CardTable; } |
97 GenRemSet::Name rs_kind() { return GenRemSet::CardTable; } |
96 |
98 |
97 CardTableRS* as_CardTableRS() { return this; } |
99 CardTableRS* as_CardTableRS() { return this; } |
98 |
100 |
99 CardTableModRefBS* ct_bs() { return &_ct_bs; } |
101 CardTableModRefBS* ct_bs() { return _ct_bs; } |
100 |
102 |
101 // Override. |
103 // Override. |
102 void prepare_for_younger_refs_iterate(bool parallel); |
104 void prepare_for_younger_refs_iterate(bool parallel); |
103 |
105 |
104 // Card table entries are cleared before application; "blk" is |
106 // Card table entries are cleared before application; "blk" is |
105 // responsible for dirtying if the oop is still older-to-younger after |
107 // responsible for dirtying if the oop is still older-to-younger after |
106 // closure application. |
108 // closure application. |
107 void younger_refs_iterate(Generation* g, OopsInGenClosure* blk); |
109 void younger_refs_iterate(Generation* g, OopsInGenClosure* blk); |
108 |
110 |
109 void inline_write_ref_field_gc(void* field, oop new_val) { |
111 void inline_write_ref_field_gc(void* field, oop new_val) { |
110 jbyte* byte = _ct_bs.byte_for(field); |
112 jbyte* byte = _ct_bs->byte_for(field); |
111 *byte = youngergen_card; |
113 *byte = youngergen_card; |
112 } |
114 } |
113 void write_ref_field_gc_work(void* field, oop new_val) { |
115 void write_ref_field_gc_work(void* field, oop new_val) { |
114 inline_write_ref_field_gc(field, new_val); |
116 inline_write_ref_field_gc(field, new_val); |
115 } |
117 } |
120 virtual void write_ref_field_gc_par(void* field, oop new_val); |
122 virtual void write_ref_field_gc_par(void* field, oop new_val); |
121 |
123 |
122 void resize_covered_region(MemRegion new_region); |
124 void resize_covered_region(MemRegion new_region); |
123 |
125 |
124 bool is_aligned(HeapWord* addr) { |
126 bool is_aligned(HeapWord* addr) { |
125 return _ct_bs.is_card_aligned(addr); |
127 return _ct_bs->is_card_aligned(addr); |
126 } |
128 } |
127 |
129 |
128 void verify(); |
130 void verify(); |
129 void verify_aligned_region_empty(MemRegion mr); |
131 void verify_aligned_region_empty(MemRegion mr); |
130 |
132 |
131 void clear(MemRegion mr) { _ct_bs.clear(mr); } |
133 void clear(MemRegion mr) { _ct_bs->clear(mr); } |
132 void clear_into_younger(Generation* gen, bool clear_perm); |
134 void clear_into_younger(Generation* gen, bool clear_perm); |
133 |
135 |
134 void invalidate(MemRegion mr) { _ct_bs.invalidate(mr); } |
136 void invalidate(MemRegion mr, bool whole_heap = false) { |
|
137 _ct_bs->invalidate(mr, whole_heap); |
|
138 } |
135 void invalidate_or_clear(Generation* gen, bool younger, bool perm); |
139 void invalidate_or_clear(Generation* gen, bool younger, bool perm); |
136 |
140 |
137 static uintx ct_max_alignment_constraint() { |
141 static uintx ct_max_alignment_constraint() { |
138 return CardTableModRefBS::ct_max_alignment_constraint(); |
142 return CardTableModRefBS::ct_max_alignment_constraint(); |
139 } |
143 } |
140 |
144 |
141 jbyte* byte_for(void* p) { return _ct_bs.byte_for(p); } |
145 jbyte* byte_for(void* p) { return _ct_bs->byte_for(p); } |
142 jbyte* byte_after(void* p) { return _ct_bs.byte_after(p); } |
146 jbyte* byte_after(void* p) { return _ct_bs->byte_after(p); } |
143 HeapWord* addr_for(jbyte* p) { return _ct_bs.addr_for(p); } |
147 HeapWord* addr_for(jbyte* p) { return _ct_bs->addr_for(p); } |
144 |
148 |
145 bool is_prev_nonclean_card_val(jbyte v) { |
149 bool is_prev_nonclean_card_val(jbyte v) { |
146 return |
150 return |
147 youngergen_card <= v && |
151 youngergen_card <= v && |
148 v <= cur_youngergen_and_prev_nonclean_card && |
152 v <= cur_youngergen_and_prev_nonclean_card && |