< prev index next >

src/share/vm/gc/g1/g1SATBCardTableModRefBS.cpp

Print this page




 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) {


< prev index next >