< prev index next >

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

Print this page




 230             *byte = dirty_card;
 231             jt->dirty_card_queue().enqueue(byte);
 232           }
 233         }
 234       } else {
 235         MutexLockerEx x(Shared_DirtyCardQ_lock,
 236                         Mutex::_no_safepoint_check_flag);
 237         for (; byte <= last_byte; byte++) {
 238           if (*byte == g1_young_gen) {
 239             continue;
 240           }
 241           if (*byte != dirty_card) {
 242             *byte = dirty_card;
 243             _dcqs.shared_dirty_card_queue()->enqueue(byte);
 244           }
 245         }
 246       }
 247     }
 248   }
 249 }



















































 230             *byte = dirty_card;
 231             jt->dirty_card_queue().enqueue(byte);
 232           }
 233         }
 234       } else {
 235         MutexLockerEx x(Shared_DirtyCardQ_lock,
 236                         Mutex::_no_safepoint_check_flag);
 237         for (; byte <= last_byte; byte++) {
 238           if (*byte == g1_young_gen) {
 239             continue;
 240           }
 241           if (*byte != dirty_card) {
 242             *byte = dirty_card;
 243             _dcqs.shared_dirty_card_queue()->enqueue(byte);
 244           }
 245         }
 246       }
 247     }
 248   }
 249 }
 250 
 251 void G1SATBCardTableModRefBS::write_ref_nmethod_post(oop* dst, nmethod* nm) {
 252   oop obj = oopDesc::load_heap_oop(dst);
 253   if (obj != NULL) {
 254     G1CollectedHeap* g1h = G1CollectedHeap::heap();
 255     HeapRegion* hr = g1h->heap_region_containing(obj);
 256     hr->add_strong_code_root(nm);
 257   }
 258 }
 259 
 260 class G1EnsureLastRefToRegion : public OopClosure {
 261   G1CollectedHeap* _g1h;
 262   HeapRegion* _hr;
 263   oop* _dst;
 264 
 265   bool _value;
 266 public:
 267   G1EnsureLastRefToRegion(G1CollectedHeap* g1h, HeapRegion* hr, oop* dst) :
 268     _g1h(g1h), _hr(hr), _dst(dst), _value(true) {}
 269 
 270   void do_oop(oop* p) {
 271     if (_value && p != _dst) {
 272       oop obj = oopDesc::load_heap_oop(p);
 273       if (obj != NULL) {
 274         HeapRegion* hr = _g1h->heap_region_containing(obj);
 275         if (hr == _hr) {
 276           // Another reference to the same region.
 277           _value = false;
 278         }
 279       }
 280     }
 281   }
 282   void do_oop(narrowOop* p) { ShouldNotReachHere(); }
 283   bool value() const        { return _value;  }
 284 };
 285 
 286 void G1SATBCardTableModRefBS::write_ref_nmethod_pre(oop* dst, nmethod* nm) {
 287   oop obj = oopDesc::load_heap_oop(dst);
 288   if (obj != NULL) {
 289     G1CollectedHeap* g1h = G1CollectedHeap::heap();
 290     HeapRegion* hr = g1h->heap_region_containing(obj);
 291     G1EnsureLastRefToRegion ensure_last_ref(g1h, hr, dst);
 292     nm->oops_do(&ensure_last_ref);
 293     if (ensure_last_ref.value()) {
 294       // Last reference to this region, remove the nmethod from the rset.
 295       hr->remove_strong_code_root(nm);
 296     }
 297   }
 298 }
< prev index next >