79
80 // Cached bit can be installed either on a clean card or on a claimed card.
81 jbyte new_val = val;
82 if (val == clean_card_val()) {
83 new_val = (jbyte)deferred_card_val();
84 } else {
85 if (val & claimed_card_val()) {
86 new_val = val | (jbyte)deferred_card_val();
87 }
88 }
89 if (new_val != val) {
90 Atomic::cmpxchg(new_val, &_byte_map[card_index], val);
91 }
92 return true;
93 }
94
95 void G1SATBCardTableModRefBS::g1_mark_as_young(const MemRegion& mr) {
96 jbyte *const first = byte_for(mr.start());
97 jbyte *const last = byte_after(mr.last());
98
99 memset(first, g1_young_gen, last - first);
100 }
101
102 #ifndef PRODUCT
103 void G1SATBCardTableModRefBS::verify_g1_young_region(MemRegion mr) {
104 verify_region(mr, g1_young_gen, true);
105 }
106 #endif
107
108 G1SATBCardTableLoggingModRefBS::
109 G1SATBCardTableLoggingModRefBS(MemRegion whole_heap,
110 int max_covered_regions) :
111 G1SATBCardTableModRefBS(whole_heap, max_covered_regions),
112 _dcqs(JavaThread::dirty_card_queue_set())
113 {
114 _kind = G1SATBCTLogging;
115 }
116
117 void
118 G1SATBCardTableLoggingModRefBS::write_ref_field_work(void* field,
119 oop new_val,
|
79
80 // Cached bit can be installed either on a clean card or on a claimed card.
81 jbyte new_val = val;
82 if (val == clean_card_val()) {
83 new_val = (jbyte)deferred_card_val();
84 } else {
85 if (val & claimed_card_val()) {
86 new_val = val | (jbyte)deferred_card_val();
87 }
88 }
89 if (new_val != val) {
90 Atomic::cmpxchg(new_val, &_byte_map[card_index], val);
91 }
92 return true;
93 }
94
95 void G1SATBCardTableModRefBS::g1_mark_as_young(const MemRegion& mr) {
96 jbyte *const first = byte_for(mr.start());
97 jbyte *const last = byte_after(mr.last());
98
99 // Below we may use an explicit loop instead of memset() because on
100 // certain platforms memset() can give concurrent readers phantom zeros.
101 if (UseMemSetInBOT) {
102 memset(first, g1_young_gen, last - first);
103 } else {
104 for (jbyte* i = first; i < last; i++) {
105 *i = g1_young_gen;
106 }
107 }
108 }
109
110 #ifndef PRODUCT
111 void G1SATBCardTableModRefBS::verify_g1_young_region(MemRegion mr) {
112 verify_region(mr, g1_young_gen, true);
113 }
114 #endif
115
116 G1SATBCardTableLoggingModRefBS::
117 G1SATBCardTableLoggingModRefBS(MemRegion whole_heap,
118 int max_covered_regions) :
119 G1SATBCardTableModRefBS(whole_heap, max_covered_regions),
120 _dcqs(JavaThread::dirty_card_queue_set())
121 {
122 _kind = G1SATBCTLogging;
123 }
124
125 void
126 G1SATBCardTableLoggingModRefBS::write_ref_field_work(void* field,
127 oop new_val,
|