176 } |
176 } |
177 } |
177 } |
178 } |
178 } |
179 |
179 |
180 void |
180 void |
181 G1SATBCardTableLoggingModRefBS::invalidate(MemRegion mr, bool whole_heap) { |
181 G1SATBCardTableLoggingModRefBS::invalidate(MemRegion mr) { |
182 volatile jbyte* byte = byte_for(mr.start()); |
182 volatile jbyte* byte = byte_for(mr.start()); |
183 jbyte* last_byte = byte_for(mr.last()); |
183 jbyte* last_byte = byte_for(mr.last()); |
184 Thread* thr = Thread::current(); |
184 Thread* thr = Thread::current(); |
185 if (whole_heap) { |
|
186 while (byte <= last_byte) { |
|
187 *byte = dirty_card; |
|
188 byte++; |
|
189 } |
|
190 } else { |
|
191 // skip all consecutive young cards |
185 // skip all consecutive young cards |
192 for (; byte <= last_byte && *byte == g1_young_gen; byte++); |
186 for (; byte <= last_byte && *byte == g1_young_gen; byte++); |
193 |
187 |
194 if (byte <= last_byte) { |
188 if (byte <= last_byte) { |
195 OrderAccess::storeload(); |
189 OrderAccess::storeload(); |
196 // Enqueue if necessary. |
190 // Enqueue if necessary. |
197 if (thr->is_Java_thread()) { |
191 if (thr->is_Java_thread()) { |
198 JavaThread* jt = (JavaThread*)thr; |
192 JavaThread* jt = (JavaThread*)thr; |
199 for (; byte <= last_byte; byte++) { |
193 for (; byte <= last_byte; byte++) { |
200 if (*byte == g1_young_gen) { |
194 if (*byte == g1_young_gen) { |
201 continue; |
195 continue; |
202 } |
196 } |
203 if (*byte != dirty_card) { |
197 if (*byte != dirty_card) { |
204 *byte = dirty_card; |
198 *byte = dirty_card; |
205 jt->dirty_card_queue().enqueue(byte); |
199 jt->dirty_card_queue().enqueue(byte); |
206 } |
200 } |
207 } |
201 } |
208 } else { |
202 } else { |
209 MutexLockerEx x(Shared_DirtyCardQ_lock, |
203 MutexLockerEx x(Shared_DirtyCardQ_lock, |
210 Mutex::_no_safepoint_check_flag); |
204 Mutex::_no_safepoint_check_flag); |
211 for (; byte <= last_byte; byte++) { |
205 for (; byte <= last_byte; byte++) { |
212 if (*byte == g1_young_gen) { |
206 if (*byte == g1_young_gen) { |
213 continue; |
207 continue; |
214 } |
208 } |
215 if (*byte != dirty_card) { |
209 if (*byte != dirty_card) { |
216 *byte = dirty_card; |
210 *byte = dirty_card; |
217 _dcqs.shared_dirty_card_queue()->enqueue(byte); |
211 _dcqs.shared_dirty_card_queue()->enqueue(byte); |
218 } |
|
219 } |
212 } |
220 } |
213 } |
221 } |
214 } |
222 } |
215 } |
223 } |
216 } |