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

Print this page
rev 6413 : 8039042: G1: Phantom zeros in cardtable
Reviewed-by: TBD


  79 
  80   // Cached bit can be installed either on a clean card or on a claimed card.
  81   jbyte new_val = val;
  82   if (val == clean_card_val()) {
  83     new_val = (jbyte)deferred_card_val();
  84   } else {
  85     if (val & claimed_card_val()) {
  86       new_val = val | (jbyte)deferred_card_val();
  87     }
  88   }
  89   if (new_val != val) {
  90     Atomic::cmpxchg(new_val, &_byte_map[card_index], val);
  91   }
  92   return true;
  93 }
  94 
  95 void G1SATBCardTableModRefBS::g1_mark_as_young(const MemRegion& mr) {
  96   jbyte *const first = byte_for(mr.start());
  97   jbyte *const last = byte_after(mr.last());
  98 



  99   memset(first, g1_young_gen, last - first);





 100 }
 101 
 102 #ifndef PRODUCT
 103 void G1SATBCardTableModRefBS::verify_g1_young_region(MemRegion mr) {
 104   verify_region(mr, g1_young_gen,  true);
 105 }
 106 #endif
 107 
 108 G1SATBCardTableLoggingModRefBS::
 109 G1SATBCardTableLoggingModRefBS(MemRegion whole_heap,
 110                                int max_covered_regions) :
 111   G1SATBCardTableModRefBS(whole_heap, max_covered_regions),
 112   _dcqs(JavaThread::dirty_card_queue_set())
 113 {
 114   _kind = G1SATBCTLogging;
 115 }
 116 
 117 void
 118 G1SATBCardTableLoggingModRefBS::write_ref_field_work(void* field,
 119                                                      oop new_val,




  79 
  80   // Cached bit can be installed either on a clean card or on a claimed card.
  81   jbyte new_val = val;
  82   if (val == clean_card_val()) {
  83     new_val = (jbyte)deferred_card_val();
  84   } else {
  85     if (val & claimed_card_val()) {
  86       new_val = val | (jbyte)deferred_card_val();
  87     }
  88   }
  89   if (new_val != val) {
  90     Atomic::cmpxchg(new_val, &_byte_map[card_index], val);
  91   }
  92   return true;
  93 }
  94 
  95 void G1SATBCardTableModRefBS::g1_mark_as_young(const MemRegion& mr) {
  96   jbyte *const first = byte_for(mr.start());
  97   jbyte *const last = byte_after(mr.last());
  98 
  99   // Below we may use an explicit loop instead of memset() because on
 100   // certain platforms memset() can give concurrent readers phantom zeros.
 101   if (UseMemSetInBOT) {
 102     memset(first, g1_young_gen, last - first);
 103   } else {
 104     for (jbyte* i = first; i < last; i++) {
 105       *i = g1_young_gen;
 106     }
 107   }
 108 }
 109 
 110 #ifndef PRODUCT
 111 void G1SATBCardTableModRefBS::verify_g1_young_region(MemRegion mr) {
 112   verify_region(mr, g1_young_gen,  true);
 113 }
 114 #endif
 115 
 116 G1SATBCardTableLoggingModRefBS::
 117 G1SATBCardTableLoggingModRefBS(MemRegion whole_heap,
 118                                int max_covered_regions) :
 119   G1SATBCardTableModRefBS(whole_heap, max_covered_regions),
 120   _dcqs(JavaThread::dirty_card_queue_set())
 121 {
 122   _kind = G1SATBCTLogging;
 123 }
 124 
 125 void
 126 G1SATBCardTableLoggingModRefBS::write_ref_field_work(void* field,
 127                                                      oop new_val,