50 }
51
52 template <class T>
53 inline void FilterOutOfRegionClosure::do_oop_nv(T* p) {
54 T heap_oop = oopDesc::load_heap_oop(p);
55 if (!oopDesc::is_null(heap_oop)) {
56 HeapWord* obj_hw = (HeapWord*)oopDesc::decode_heap_oop_not_null(heap_oop);
57 if (obj_hw < _r_bottom || obj_hw >= _r_end) {
58 _oc->do_oop(p);
59 }
60 }
61 }
62
63 // This closure is applied to the fields of the objects that have just been copied.
64 template <class T>
65 inline void G1ParScanClosure::do_oop_nv(T* p) {
66 T heap_oop = oopDesc::load_heap_oop(p);
67
68 if (!oopDesc::is_null(heap_oop)) {
69 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
70 const in_cset_state_t state = _g1->in_cset_state(obj);
71 if (InCSetState::is_in_cset(state)) {
72 // We're not going to even bother checking whether the object is
73 // already forwarded or not, as this usually causes an immediate
74 // stall. We'll try to prefetch the object (for write, given that
75 // we might need to install the forwarding reference) and we'll
76 // get back to it when pop it from the queue
77 Prefetch::write(obj->mark_addr(), 0);
78 Prefetch::read(obj->mark_addr(), (HeapWordSize*2));
79
80 // slightly paranoid test; I'm trying to catch potential
81 // problems before we go into push_on_queue to know where the
82 // problem is coming from
83 assert((obj == oopDesc::load_decode_heap_oop(p)) ||
84 (obj->is_forwarded() &&
85 obj->forwardee() == oopDesc::load_decode_heap_oop(p)),
86 "p should still be pointing to obj or to its forwardee");
87
88 _par_scan_state->push_on_queue(p);
89 } else {
90 if (InCSetState::is_humongous(state)) {
91 _g1->set_humongous_is_live(obj);
92 }
93 _par_scan_state->update_rs(_from, p, _worker_id);
94 }
95 }
96 }
97
98 template <class T>
99 inline void G1ParPushHeapRSClosure::do_oop_nv(T* p) {
100 T heap_oop = oopDesc::load_heap_oop(p);
101
102 if (!oopDesc::is_null(heap_oop)) {
103 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
104 if (_g1->is_in_cset_or_humongous(obj)) {
105 Prefetch::write(obj->mark_addr(), 0);
106 Prefetch::read(obj->mark_addr(), (HeapWordSize*2));
107
108 // Place on the references queue
109 _par_scan_state->push_on_queue(p);
110 } else {
|
50 }
51
52 template <class T>
53 inline void FilterOutOfRegionClosure::do_oop_nv(T* p) {
54 T heap_oop = oopDesc::load_heap_oop(p);
55 if (!oopDesc::is_null(heap_oop)) {
56 HeapWord* obj_hw = (HeapWord*)oopDesc::decode_heap_oop_not_null(heap_oop);
57 if (obj_hw < _r_bottom || obj_hw >= _r_end) {
58 _oc->do_oop(p);
59 }
60 }
61 }
62
63 // This closure is applied to the fields of the objects that have just been copied.
64 template <class T>
65 inline void G1ParScanClosure::do_oop_nv(T* p) {
66 T heap_oop = oopDesc::load_heap_oop(p);
67
68 if (!oopDesc::is_null(heap_oop)) {
69 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
70 const InCSetState state = _g1->in_cset_state(obj);
71 if (state.is_in_cset()) {
72 // We're not going to even bother checking whether the object is
73 // already forwarded or not, as this usually causes an immediate
74 // stall. We'll try to prefetch the object (for write, given that
75 // we might need to install the forwarding reference) and we'll
76 // get back to it when pop it from the queue
77 Prefetch::write(obj->mark_addr(), 0);
78 Prefetch::read(obj->mark_addr(), (HeapWordSize*2));
79
80 // slightly paranoid test; I'm trying to catch potential
81 // problems before we go into push_on_queue to know where the
82 // problem is coming from
83 assert((obj == oopDesc::load_decode_heap_oop(p)) ||
84 (obj->is_forwarded() &&
85 obj->forwardee() == oopDesc::load_decode_heap_oop(p)),
86 "p should still be pointing to obj or to its forwardee");
87
88 _par_scan_state->push_on_queue(p);
89 } else {
90 if (state.is_humongous()) {
91 _g1->set_humongous_is_live(obj);
92 }
93 _par_scan_state->update_rs(_from, p, _worker_id);
94 }
95 }
96 }
97
98 template <class T>
99 inline void G1ParPushHeapRSClosure::do_oop_nv(T* p) {
100 T heap_oop = oopDesc::load_heap_oop(p);
101
102 if (!oopDesc::is_null(heap_oop)) {
103 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
104 if (_g1->is_in_cset_or_humongous(obj)) {
105 Prefetch::write(obj->mark_addr(), 0);
106 Prefetch::read(obj->mark_addr(), (HeapWordSize*2));
107
108 // Place on the references queue
109 _par_scan_state->push_on_queue(p);
110 } else {
|