hotspot/src/share/vm/gc/g1/g1SATBCardTableModRefBS.cpp
changeset 42598 45562c0473fb
parent 40655 9f644073d3a0
child 46968 9119841280f4
equal deleted inserted replaced
42597:a9611bab7578 42598:45562c0473fb
   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 }