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 } |