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