27
28 #include "gc_implementation/g1/concurrentMark.inline.hpp"
29 #include "gc_implementation/g1/g1CollectedHeap.hpp"
30 #include "gc_implementation/g1/g1OopClosures.hpp"
31 #include "gc_implementation/g1/g1ParScanThreadState.inline.hpp"
32 #include "gc_implementation/g1/g1RemSet.hpp"
33 #include "gc_implementation/g1/g1RemSet.inline.hpp"
34 #include "gc_implementation/g1/heapRegionRemSet.hpp"
35 #include "memory/iterator.inline.hpp"
36 #include "runtime/prefetch.inline.hpp"
37
38 /*
39 * This really ought to be an inline function, but apparently the C++
40 * compiler sometimes sees fit to ignore inline declarations. Sigh.
41 */
42
43 template <class T>
44 inline void FilterIntoCSClosure::do_oop_nv(T* p) {
45 T heap_oop = oopDesc::load_heap_oop(p);
46 if (!oopDesc::is_null(heap_oop) &&
47 _g1->obj_in_cs(oopDesc::decode_heap_oop_not_null(heap_oop))) {
48 _oc->do_oop(p);
49 }
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->in_cset_fast_test(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->in_cset_fast_test(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 }
107 }
108 }
109
110 template <class T>
111 inline void G1CMOopClosure::do_oop_nv(T* p) {
112 oop obj = oopDesc::load_decode_heap_oop(p);
113 if (_cm->verbose_high()) {
114 gclog_or_tty->print_cr("[%u] we're looking at location "
115 "*"PTR_FORMAT" = "PTR_FORMAT,
116 _task->worker_id(), p2i(p), p2i((void*) obj));
117 }
118 _task->deal_with_reference(obj);
119 }
120
121 template <class T>
122 inline void G1RootRegionScanClosure::do_oop_nv(T* p) {
123 T heap_oop = oopDesc::load_heap_oop(p);
124 if (!oopDesc::is_null(heap_oop)) {
125 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
|
27
28 #include "gc_implementation/g1/concurrentMark.inline.hpp"
29 #include "gc_implementation/g1/g1CollectedHeap.hpp"
30 #include "gc_implementation/g1/g1OopClosures.hpp"
31 #include "gc_implementation/g1/g1ParScanThreadState.inline.hpp"
32 #include "gc_implementation/g1/g1RemSet.hpp"
33 #include "gc_implementation/g1/g1RemSet.inline.hpp"
34 #include "gc_implementation/g1/heapRegionRemSet.hpp"
35 #include "memory/iterator.inline.hpp"
36 #include "runtime/prefetch.inline.hpp"
37
38 /*
39 * This really ought to be an inline function, but apparently the C++
40 * compiler sometimes sees fit to ignore inline declarations. Sigh.
41 */
42
43 template <class T>
44 inline void FilterIntoCSClosure::do_oop_nv(T* p) {
45 T heap_oop = oopDesc::load_heap_oop(p);
46 if (!oopDesc::is_null(heap_oop) &&
47 _g1->is_in_cset_or_humongous(oopDesc::decode_heap_oop_not_null(heap_oop))) {
48 _oc->do_oop(p);
49 }
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 }
113 }
114 }
115
116 template <class T>
117 inline void G1CMOopClosure::do_oop_nv(T* p) {
118 oop obj = oopDesc::load_decode_heap_oop(p);
119 if (_cm->verbose_high()) {
120 gclog_or_tty->print_cr("[%u] we're looking at location "
121 "*"PTR_FORMAT" = "PTR_FORMAT,
122 _task->worker_id(), p2i(p), p2i((void*) obj));
123 }
124 _task->deal_with_reference(obj);
125 }
126
127 template <class T>
128 inline void G1RootRegionScanClosure::do_oop_nv(T* p) {
129 T heap_oop = oopDesc::load_heap_oop(p);
130 if (!oopDesc::is_null(heap_oop)) {
131 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
|