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 if (_g1->is_in_cset_or_humongous(obj)) {
71 // We're not going to even bother checking whether the object is
72 // already forwarded or not, as this usually causes an immediate
73 // stall. We'll try to prefetch the object (for write, given that
74 // we might need to install the forwarding reference) and we'll
75 // get back to it when pop it from the queue
76 Prefetch::write(obj->mark_addr(), 0);
77 Prefetch::read(obj->mark_addr(), (HeapWordSize*2));
78
79 // slightly paranoid test; I'm trying to catch potential
80 // problems before we go into push_on_queue to know where the
81 // problem is coming from
82 assert((obj == oopDesc::load_decode_heap_oop(p)) ||
83 (obj->is_forwarded() &&
84 obj->forwardee() == oopDesc::load_decode_heap_oop(p)),
85 "p should still be pointing to obj or to its forwardee");
86
87 _par_scan_state->push_on_queue(p);
88 } else {
89 _par_scan_state->update_rs(_from, p, _worker_id);
90 }
91 }
92 }
93
94 template <class T>
95 inline void G1ParPushHeapRSClosure::do_oop_nv(T* p) {
96 T heap_oop = oopDesc::load_heap_oop(p);
97
98 if (!oopDesc::is_null(heap_oop)) {
99 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
100 if (_g1->is_in_cset_or_humongous(obj)) {
101 Prefetch::write(obj->mark_addr(), 0);
102 Prefetch::read(obj->mark_addr(), (HeapWordSize*2));
103
104 // Place on the references queue
105 _par_scan_state->push_on_queue(p);
106 } else {
107 assert(!_g1->obj_in_cs(obj), "checking");
108 }
|
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 G1FastCSetBiasedMappedArray::in_cset_state_t state = _g1->in_cset_state(obj);
71 if (state == G1FastCSetBiasedMappedArray::InCSet) {
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 == G1FastCSetBiasedMappedArray::IsHumongous) {
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 {
111 assert(!_g1->obj_in_cs(obj), "checking");
112 }
|