< prev index next >

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

Print this page




 197         if (*byte != dirty_card) {
 198           *byte = dirty_card;
 199           jt->dirty_card_queue().enqueue(byte);
 200         }
 201       }
 202     } else {
 203       MutexLockerEx x(Shared_DirtyCardQ_lock,
 204                       Mutex::_no_safepoint_check_flag);
 205       for (; byte <= last_byte; byte++) {
 206         if (*byte == g1_young_gen) {
 207           continue;
 208         }
 209         if (*byte != dirty_card) {
 210           *byte = dirty_card;
 211           _dcqs.shared_dirty_card_queue()->enqueue(byte);
 212         }
 213       }
 214     }
 215   }
 216 }
 217 
 218 void G1SATBCardTableModRefBS::write_ref_nmethod_post(oop* dst, nmethod* nm) {
 219   oop obj = oopDesc::load_heap_oop(dst);
 220   if (obj != NULL) {
 221     G1CollectedHeap* g1h = G1CollectedHeap::heap();
 222     HeapRegion* hr = g1h->heap_region_containing(obj);
 223     hr->add_strong_code_root(nm);
 224   }
 225 }
 226 
 227 class G1EnsureLastRefToRegion : public OopClosure {
 228   G1CollectedHeap* _g1h;
 229   HeapRegion* _hr;
 230   oop* _dst;
 231 
 232   bool _value;
 233 public:
 234   G1EnsureLastRefToRegion(G1CollectedHeap* g1h, HeapRegion* hr, oop* dst) :
 235     _g1h(g1h), _hr(hr), _dst(dst), _value(true) {}
 236 
 237   void do_oop(oop* p) {
 238     if (_value && p != _dst) {
 239       oop obj = oopDesc::load_heap_oop(p);
 240       if (obj != NULL) {
 241         HeapRegion* hr = _g1h->heap_region_containing(obj);
 242         if (hr == _hr) {
 243           // Another reference to the same region.
 244           _value = false;
 245         }
 246       }
 247     }
 248   }
 249   void do_oop(narrowOop* p) { ShouldNotReachHere(); }
 250   bool value() const        { return _value;  }
 251 };
 252 
 253 void G1SATBCardTableModRefBS::write_ref_nmethod_pre(oop* dst, nmethod* nm) {
 254   oop obj = oopDesc::load_heap_oop(dst);
 255   if (obj != NULL) {
 256     G1CollectedHeap* g1h = G1CollectedHeap::heap();
 257     HeapRegion* hr = g1h->heap_region_containing(obj);
 258     G1EnsureLastRefToRegion ensure_last_ref(g1h, hr, dst);
 259     nm->oops_do(&ensure_last_ref);
 260     if (ensure_last_ref.value()) {
 261       // Last reference to this region, remove the nmethod from the rset.
 262       hr->remove_strong_code_root(nm);
 263     }
 264   }
 265 }


 197         if (*byte != dirty_card) {
 198           *byte = dirty_card;
 199           jt->dirty_card_queue().enqueue(byte);
 200         }
 201       }
 202     } else {
 203       MutexLockerEx x(Shared_DirtyCardQ_lock,
 204                       Mutex::_no_safepoint_check_flag);
 205       for (; byte <= last_byte; byte++) {
 206         if (*byte == g1_young_gen) {
 207           continue;
 208         }
 209         if (*byte != dirty_card) {
 210           *byte = dirty_card;
 211           _dcqs.shared_dirty_card_queue()->enqueue(byte);
 212         }
 213       }
 214     }
 215   }
 216 }

















































< prev index next >