src/share/vm/gc_implementation/g1/g1OopClosures.inline.hpp

changeset 7010
a3953c777565
parent 6992
2c6ef90f030a
child 7049
eec72fa4b108
equal deleted inserted replaced
7009:3f2894c5052e 7010:a3953c777565
42 42
43 template <class T> 43 template <class T>
44 inline void FilterIntoCSClosure::do_oop_nv(T* p) { 44 inline void FilterIntoCSClosure::do_oop_nv(T* p) {
45 T heap_oop = oopDesc::load_heap_oop(p); 45 T heap_oop = oopDesc::load_heap_oop(p);
46 if (!oopDesc::is_null(heap_oop) && 46 if (!oopDesc::is_null(heap_oop) &&
47 _g1->obj_in_cs(oopDesc::decode_heap_oop_not_null(heap_oop))) { 47 _g1->is_in_cset_or_humongous(oopDesc::decode_heap_oop_not_null(heap_oop))) {
48 _oc->do_oop(p); 48 _oc->do_oop(p);
49 } 49 }
50 } 50 }
51 51
52 template <class T> 52 template <class T>
65 inline void G1ParScanClosure::do_oop_nv(T* p) { 65 inline void G1ParScanClosure::do_oop_nv(T* p) {
66 T heap_oop = oopDesc::load_heap_oop(p); 66 T heap_oop = oopDesc::load_heap_oop(p);
67 67
68 if (!oopDesc::is_null(heap_oop)) { 68 if (!oopDesc::is_null(heap_oop)) {
69 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); 69 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
70 if (_g1->in_cset_fast_test(obj)) { 70 G1CollectedHeap::in_cset_state_t state = _g1->in_cset_state(obj);
71 if (state == G1CollectedHeap::InCSet) {
71 // We're not going to even bother checking whether the object is 72 // We're not going to even bother checking whether the object is
72 // already forwarded or not, as this usually causes an immediate 73 // already forwarded or not, as this usually causes an immediate
73 // stall. We'll try to prefetch the object (for write, given that 74 // 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 // we might need to install the forwarding reference) and we'll
75 // get back to it when pop it from the queue 76 // get back to it when pop it from the queue
84 obj->forwardee() == oopDesc::load_decode_heap_oop(p)), 85 obj->forwardee() == oopDesc::load_decode_heap_oop(p)),
85 "p should still be pointing to obj or to its forwardee"); 86 "p should still be pointing to obj or to its forwardee");
86 87
87 _par_scan_state->push_on_queue(p); 88 _par_scan_state->push_on_queue(p);
88 } else { 89 } else {
90 if (state == G1CollectedHeap::IsHumongous) {
91 _g1->set_humongous_is_live(obj);
92 }
89 _par_scan_state->update_rs(_from, p, _worker_id); 93 _par_scan_state->update_rs(_from, p, _worker_id);
90 } 94 }
91 } 95 }
92 } 96 }
93 97
95 inline void G1ParPushHeapRSClosure::do_oop_nv(T* p) { 99 inline void G1ParPushHeapRSClosure::do_oop_nv(T* p) {
96 T heap_oop = oopDesc::load_heap_oop(p); 100 T heap_oop = oopDesc::load_heap_oop(p);
97 101
98 if (!oopDesc::is_null(heap_oop)) { 102 if (!oopDesc::is_null(heap_oop)) {
99 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); 103 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
100 if (_g1->in_cset_fast_test(obj)) { 104 if (_g1->is_in_cset_or_humongous(obj)) {
101 Prefetch::write(obj->mark_addr(), 0); 105 Prefetch::write(obj->mark_addr(), 0);
102 Prefetch::read(obj->mark_addr(), (HeapWordSize*2)); 106 Prefetch::read(obj->mark_addr(), (HeapWordSize*2));
103 107
104 // Place on the references queue 108 // Place on the references queue
105 _par_scan_state->push_on_queue(p); 109 _par_scan_state->push_on_queue(p);
110 } else {
111 assert(!_g1->obj_in_cs(obj), "checking");
106 } 112 }
107 } 113 }
108 } 114 }
109 115
110 template <class T> 116 template <class T>

mercurial