172 volatile jbyte* byte = byte_for(field); 173 if (*byte == g1_young_gen) { 174 return; 175 } 176 OrderAccess::storeload(); 177 if (*byte != dirty_card) { 178 *byte = dirty_card; 179 Thread* thr = Thread::current(); 180 if (thr->is_Java_thread()) { 181 JavaThread* jt = (JavaThread*)thr; 182 jt->dirty_card_queue().enqueue(byte); 183 } else { 184 MutexLockerEx x(Shared_DirtyCardQ_lock, 185 Mutex::_no_safepoint_check_flag); 186 _dcqs.shared_dirty_card_queue()->enqueue(byte); 187 } 188 } 189 } 190 191 void 192 G1SATBCardTableLoggingModRefBS::write_ref_field_static(void* field, 193 oop new_val) { 194 uintptr_t field_uint = (uintptr_t)field; 195 uintptr_t new_val_uint = cast_from_oop<uintptr_t>(new_val); 196 uintptr_t comb = field_uint ^ new_val_uint; 197 comb = comb >> HeapRegion::LogOfHRGrainBytes; 198 if (comb == 0) return; 199 if (new_val == NULL) return; 200 // Otherwise, log it. 201 G1SATBCardTableLoggingModRefBS* g1_bs = 202 barrier_set_cast<G1SATBCardTableLoggingModRefBS>(G1CollectedHeap::heap()->barrier_set()); 203 g1_bs->write_ref_field_work(field, new_val, false); 204 } 205 206 void 207 G1SATBCardTableLoggingModRefBS::invalidate(MemRegion mr, bool whole_heap) { 208 volatile jbyte* byte = byte_for(mr.start()); 209 jbyte* last_byte = byte_for(mr.last()); 210 Thread* thr = Thread::current(); 211 if (whole_heap) { 212 while (byte <= last_byte) { 213 *byte = dirty_card; 214 byte++; 215 } 216 } else { 217 // skip all consecutive young cards 218 for (; byte <= last_byte && *byte == g1_young_gen; byte++); 219 220 if (byte <= last_byte) { 221 OrderAccess::storeload(); 222 // Enqueue if necessary. 223 if (thr->is_Java_thread()) { 224 JavaThread* jt = (JavaThread*)thr; 225 for (; byte <= last_byte; byte++) { 226 if (*byte == g1_young_gen) { | 172 volatile jbyte* byte = byte_for(field); 173 if (*byte == g1_young_gen) { 174 return; 175 } 176 OrderAccess::storeload(); 177 if (*byte != dirty_card) { 178 *byte = dirty_card; 179 Thread* thr = Thread::current(); 180 if (thr->is_Java_thread()) { 181 JavaThread* jt = (JavaThread*)thr; 182 jt->dirty_card_queue().enqueue(byte); 183 } else { 184 MutexLockerEx x(Shared_DirtyCardQ_lock, 185 Mutex::_no_safepoint_check_flag); 186 _dcqs.shared_dirty_card_queue()->enqueue(byte); 187 } 188 } 189 } 190 191 void 192 G1SATBCardTableLoggingModRefBS::invalidate(MemRegion mr, bool whole_heap) { 193 volatile jbyte* byte = byte_for(mr.start()); 194 jbyte* last_byte = byte_for(mr.last()); 195 Thread* thr = Thread::current(); 196 if (whole_heap) { 197 while (byte <= last_byte) { 198 *byte = dirty_card; 199 byte++; 200 } 201 } else { 202 // skip all consecutive young cards 203 for (; byte <= last_byte && *byte == g1_young_gen; byte++); 204 205 if (byte <= last_byte) { 206 OrderAccess::storeload(); 207 // Enqueue if necessary. 208 if (thr->is_Java_thread()) { 209 JavaThread* jt = (JavaThread*)thr; 210 for (; byte <= last_byte; byte++) { 211 if (*byte == g1_young_gen) { |