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

changeset 5860
69944b868a32
parent 5811
d55c004e1d4d
child 5865
aa6f2ea19d8f
     1.1 --- a/src/share/vm/gc_implementation/g1/g1SATBCardTableModRefBS.cpp	Fri Oct 04 13:33:02 2013 +0200
     1.2 +++ b/src/share/vm/gc_implementation/g1/g1SATBCardTableModRefBS.cpp	Tue Oct 08 17:35:51 2013 +0200
     1.3 @@ -70,6 +70,12 @@
     1.4    if ((val & (clean_card_mask_val() | deferred_card_val())) == deferred_card_val()) {
     1.5      return false;
     1.6    }
     1.7 +
     1.8 +  if  (val == g1_young_gen) {
     1.9 +    // the card is for a young gen region. We don't need to keep track of all pointers into young
    1.10 +    return false;
    1.11 +  }
    1.12 +
    1.13    // Cached bit can be installed either on a clean card or on a claimed card.
    1.14    jbyte new_val = val;
    1.15    if (val == clean_card_val()) {
    1.16 @@ -85,6 +91,19 @@
    1.17    return true;
    1.18  }
    1.19  
    1.20 +void G1SATBCardTableModRefBS::g1_mark_as_young(const MemRegion& mr) {
    1.21 +  jbyte *const first = byte_for(mr.start());
    1.22 +  jbyte *const last = byte_after(mr.last());
    1.23 +
    1.24 +  memset(first, g1_young_gen, last - first);
    1.25 +}
    1.26 +
    1.27 +#ifndef PRODUCT
    1.28 +void G1SATBCardTableModRefBS::verify_g1_young_region(MemRegion mr) {
    1.29 +  verify_region(mr, g1_young_gen,  true);
    1.30 +}
    1.31 +#endif
    1.32 +
    1.33  G1SATBCardTableLoggingModRefBS::
    1.34  G1SATBCardTableLoggingModRefBS(MemRegion whole_heap,
    1.35                                 int max_covered_regions) :
    1.36 @@ -97,7 +116,11 @@
    1.37  void
    1.38  G1SATBCardTableLoggingModRefBS::write_ref_field_work(void* field,
    1.39                                                       oop new_val) {
    1.40 -  jbyte* byte = byte_for(field);
    1.41 +  volatile jbyte* byte = byte_for(field);
    1.42 +  if (*byte == g1_young_gen) {
    1.43 +    return;
    1.44 +  }
    1.45 +  OrderAccess::storeload();
    1.46    if (*byte != dirty_card) {
    1.47      *byte = dirty_card;
    1.48      Thread* thr = Thread::current();
    1.49 @@ -129,7 +152,7 @@
    1.50  
    1.51  void
    1.52  G1SATBCardTableLoggingModRefBS::invalidate(MemRegion mr, bool whole_heap) {
    1.53 -  jbyte* byte = byte_for(mr.start());
    1.54 +  volatile jbyte* byte = byte_for(mr.start());
    1.55    jbyte* last_byte = byte_for(mr.last());
    1.56    Thread* thr = Thread::current();
    1.57    if (whole_heap) {
    1.58 @@ -138,25 +161,35 @@
    1.59        byte++;
    1.60      }
    1.61    } else {
    1.62 -    // Enqueue if necessary.
    1.63 -    if (thr->is_Java_thread()) {
    1.64 -      JavaThread* jt = (JavaThread*)thr;
    1.65 -      while (byte <= last_byte) {
    1.66 -        if (*byte != dirty_card) {
    1.67 -          *byte = dirty_card;
    1.68 -          jt->dirty_card_queue().enqueue(byte);
    1.69 +    // skip all consecutive young cards
    1.70 +    for (; byte <= last_byte && *byte == g1_young_gen; byte++);
    1.71 +
    1.72 +    if (byte <= last_byte) {
    1.73 +      OrderAccess::storeload();
    1.74 +      // Enqueue if necessary.
    1.75 +      if (thr->is_Java_thread()) {
    1.76 +        JavaThread* jt = (JavaThread*)thr;
    1.77 +        for (; byte <= last_byte; byte++) {
    1.78 +          if (*byte == g1_young_gen) {
    1.79 +            continue;
    1.80 +          }
    1.81 +          if (*byte != dirty_card) {
    1.82 +            *byte = dirty_card;
    1.83 +            jt->dirty_card_queue().enqueue(byte);
    1.84 +          }
    1.85          }
    1.86 -        byte++;
    1.87 -      }
    1.88 -    } else {
    1.89 -      MutexLockerEx x(Shared_DirtyCardQ_lock,
    1.90 -                      Mutex::_no_safepoint_check_flag);
    1.91 -      while (byte <= last_byte) {
    1.92 -        if (*byte != dirty_card) {
    1.93 -          *byte = dirty_card;
    1.94 -          _dcqs.shared_dirty_card_queue()->enqueue(byte);
    1.95 +      } else {
    1.96 +        MutexLockerEx x(Shared_DirtyCardQ_lock,
    1.97 +                        Mutex::_no_safepoint_check_flag);
    1.98 +        for (; byte <= last_byte; byte++) {
    1.99 +          if (*byte == g1_young_gen) {
   1.100 +            continue;
   1.101 +          }
   1.102 +          if (*byte != dirty_card) {
   1.103 +            *byte = dirty_card;
   1.104 +            _dcqs.shared_dirty_card_queue()->enqueue(byte);
   1.105 +          }
   1.106          }
   1.107 -        byte++;
   1.108        }
   1.109      }
   1.110    }

mercurial