< prev index next >

src/hotspot/share/gc/g1/g1OopClosures.inline.hpp

Print this page




  70 inline void G1ScanClosureBase::trim_queue_partially() {
  71   _par_scan_state->trim_queue_partially();
  72 }
  73 
  74 template <class T>
  75 inline void G1ScanEvacuatedObjClosure::do_oop_work(T* p) {
  76   T heap_oop = RawAccess<>::oop_load(p);
  77 
  78   if (CompressedOops::is_null(heap_oop)) {
  79     return;
  80   }
  81   oop obj = CompressedOops::decode_not_null(heap_oop);
  82   const InCSetState state = _g1h->in_cset_state(obj);
  83   if (state.is_in_cset()) {
  84     prefetch_and_push(p, obj);
  85   } else {
  86     if (HeapRegion::is_in_same_region(p, obj)) {
  87       return;
  88     }
  89     handle_non_cset_obj_common(state, p, obj);
  90     if (_from_is_young) {
  91       return;
  92     }
  93     _par_scan_state->enqueue_card_if_tracked(p, obj);
  94   }
  95 }
  96 
  97 template <class T>
  98 inline void G1CMOopClosure::do_oop_work(T* p) {
  99   _task->deal_with_reference(p);
 100 }
 101 
 102 template <class T>
 103 inline void G1RootRegionScanClosure::do_oop_work(T* p) {
 104   T heap_oop = RawAccess<MO_VOLATILE>::oop_load(p);
 105   if (CompressedOops::is_null(heap_oop)) {
 106     return;
 107   }
 108   oop obj = CompressedOops::decode_not_null(heap_oop);
 109   _cm->mark_in_next_bitmap(_worker_id, obj);
 110 }


 163 inline void G1ScanObjsDuringUpdateRSClosure::do_oop_work(T* p) {
 164   T o = RawAccess<>::oop_load(p);
 165   if (CompressedOops::is_null(o)) {
 166     return;
 167   }
 168   oop obj = CompressedOops::decode_not_null(o);
 169 
 170   check_obj_during_refinement(p, obj);
 171 
 172   assert(!_g1h->is_in_cset((HeapWord*)p), "Oop originates from " PTR_FORMAT " (region: %u) which is in the collection set.", p2i(p), _g1h->addr_to_region((HeapWord*)p));
 173   const InCSetState state = _g1h->in_cset_state(obj);
 174   if (state.is_in_cset()) {
 175     // Since the source is always from outside the collection set, here we implicitly know
 176     // that this is a cross-region reference too.
 177     prefetch_and_push(p, obj);
 178   } else {
 179     if (HeapRegion::is_in_same_region(p, obj)) {
 180       return;
 181     }
 182     handle_non_cset_obj_common(state, p, obj);
 183     assert(!_from_is_young, "Should not be the case.");
 184     _par_scan_state->enqueue_card_if_tracked(p, obj);
 185   }
 186 }
 187 
 188 template <class T>
 189 inline void G1ScanObjsDuringScanRSClosure::do_oop_work(T* p) {
 190   T heap_oop = RawAccess<>::oop_load(p);
 191   if (CompressedOops::is_null(heap_oop)) {
 192     return;
 193   }
 194   oop obj = CompressedOops::decode_not_null(heap_oop);
 195 
 196   const InCSetState state = _g1h->in_cset_state(obj);
 197   if (state.is_in_cset()) {
 198     prefetch_and_push(p, obj);
 199   } else {
 200     if (HeapRegion::is_in_same_region(p, obj)) {
 201       return;
 202     }
 203     handle_non_cset_obj_common(state, p, obj);




  70 inline void G1ScanClosureBase::trim_queue_partially() {
  71   _par_scan_state->trim_queue_partially();
  72 }
  73 
  74 template <class T>
  75 inline void G1ScanEvacuatedObjClosure::do_oop_work(T* p) {
  76   T heap_oop = RawAccess<>::oop_load(p);
  77 
  78   if (CompressedOops::is_null(heap_oop)) {
  79     return;
  80   }
  81   oop obj = CompressedOops::decode_not_null(heap_oop);
  82   const InCSetState state = _g1h->in_cset_state(obj);
  83   if (state.is_in_cset()) {
  84     prefetch_and_push(p, obj);
  85   } else {
  86     if (HeapRegion::is_in_same_region(p, obj)) {
  87       return;
  88     }
  89     handle_non_cset_obj_common(state, p, obj);
  90     if (_scanning_in_young) {
  91       return;
  92     }
  93     _par_scan_state->enqueue_card_if_tracked(p, obj);
  94   }
  95 }
  96 
  97 template <class T>
  98 inline void G1CMOopClosure::do_oop_work(T* p) {
  99   _task->deal_with_reference(p);
 100 }
 101 
 102 template <class T>
 103 inline void G1RootRegionScanClosure::do_oop_work(T* p) {
 104   T heap_oop = RawAccess<MO_VOLATILE>::oop_load(p);
 105   if (CompressedOops::is_null(heap_oop)) {
 106     return;
 107   }
 108   oop obj = CompressedOops::decode_not_null(heap_oop);
 109   _cm->mark_in_next_bitmap(_worker_id, obj);
 110 }


 163 inline void G1ScanObjsDuringUpdateRSClosure::do_oop_work(T* p) {
 164   T o = RawAccess<>::oop_load(p);
 165   if (CompressedOops::is_null(o)) {
 166     return;
 167   }
 168   oop obj = CompressedOops::decode_not_null(o);
 169 
 170   check_obj_during_refinement(p, obj);
 171 
 172   assert(!_g1h->is_in_cset((HeapWord*)p), "Oop originates from " PTR_FORMAT " (region: %u) which is in the collection set.", p2i(p), _g1h->addr_to_region((HeapWord*)p));
 173   const InCSetState state = _g1h->in_cset_state(obj);
 174   if (state.is_in_cset()) {
 175     // Since the source is always from outside the collection set, here we implicitly know
 176     // that this is a cross-region reference too.
 177     prefetch_and_push(p, obj);
 178   } else {
 179     if (HeapRegion::is_in_same_region(p, obj)) {
 180       return;
 181     }
 182     handle_non_cset_obj_common(state, p, obj);

 183     _par_scan_state->enqueue_card_if_tracked(p, obj);
 184   }
 185 }
 186 
 187 template <class T>
 188 inline void G1ScanObjsDuringScanRSClosure::do_oop_work(T* p) {
 189   T heap_oop = RawAccess<>::oop_load(p);
 190   if (CompressedOops::is_null(heap_oop)) {
 191     return;
 192   }
 193   oop obj = CompressedOops::decode_not_null(heap_oop);
 194 
 195   const InCSetState state = _g1h->in_cset_state(obj);
 196   if (state.is_in_cset()) {
 197     prefetch_and_push(p, obj);
 198   } else {
 199     if (HeapRegion::is_in_same_region(p, obj)) {
 200       return;
 201     }
 202     handle_non_cset_obj_common(state, p, obj);


< prev index next >