8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #ifndef SHARE_VM_GC_SHARED_GENOOPCLOSURES_INLINE_HPP
26 #define SHARE_VM_GC_SHARED_GENOOPCLOSURES_INLINE_HPP
27
28 #include "gc/serial/defNewGeneration.hpp"
29 #include "gc/shared/cardTableRS.hpp"
30 #include "gc/shared/genCollectedHeap.hpp"
31 #include "gc/shared/genOopClosures.hpp"
32 #include "gc/shared/generation.hpp"
33 #include "gc/shared/space.hpp"
34 #include "oops/access.inline.hpp"
35 #include "oops/compressedOops.inline.hpp"
36 #include "oops/oop.inline.hpp"
37
38 inline OopsInGenClosure::OopsInGenClosure(Generation* gen) :
39 ExtendedOopClosure(gen->ref_processor()), _orig_gen(gen), _rs(NULL) {
40 set_generation(gen);
41 }
42
43 inline void OopsInGenClosure::set_generation(Generation* gen) {
44 _gen = gen;
45 _gen_boundary = _gen->reserved().start();
46 // Barrier set for the heap, must be set after heap is initialized
47 if (_rs == NULL) {
48 _rs = GenCollectedHeap::heap()->rem_set();
49 }
50 }
51
52 template <class T> inline void OopsInGenClosure::do_barrier(T* p) {
53 assert(generation()->is_in_reserved(p), "expected ref in generation");
54 T heap_oop = RawAccess<>::oop_load(p);
55 assert(!CompressedOops::is_null(heap_oop), "expected non-null oop");
56 oop obj = CompressedOops::decode_not_null(heap_oop);
61 }
62
63 template <class T> inline void OopsInGenClosure::par_do_barrier(T* p) {
64 assert(generation()->is_in_reserved(p), "expected ref in generation");
65 T heap_oop = RawAccess<>::oop_load(p);
66 assert(!CompressedOops::is_null(heap_oop), "expected non-null oop");
67 oop obj = CompressedOops::decode_not_null(heap_oop);
68 // If p points to a younger generation, mark the card.
69 if ((HeapWord*)obj < gen_boundary()) {
70 rs()->write_ref_field_gc_par(p, obj);
71 }
72 }
73
74 inline void OopsInClassLoaderDataOrGenClosure::do_cld_barrier() {
75 assert(_scanned_cld != NULL, "Must be");
76 if (!_scanned_cld->has_modified_oops()) {
77 _scanned_cld->record_modified_oops();
78 }
79 }
80
81 // NOTE! Any changes made here should also be made
82 // in FastScanClosure::do_oop_work()
83 template <class T> inline void ScanClosure::do_oop_work(T* p) {
84 T heap_oop = RawAccess<>::oop_load(p);
85 // Should we copy the obj?
86 if (!CompressedOops::is_null(heap_oop)) {
87 oop obj = CompressedOops::decode_not_null(heap_oop);
88 if ((HeapWord*)obj < _boundary) {
89 assert(!_g->to()->is_in_reserved(obj), "Scanning field twice?");
90 oop new_obj = obj->is_forwarded() ? obj->forwardee()
91 : _g->copy_to_survivor_space(obj);
92 RawAccess<OOP_NOT_NULL>::oop_store(p, new_obj);
93 }
94
95 if (is_scanning_a_cld()) {
96 do_cld_barrier();
97 } else if (_gc_barrier) {
98 // Now call parent closure
99 do_barrier(p);
100 }
112 if (!CompressedOops::is_null(heap_oop)) {
113 oop obj = CompressedOops::decode_not_null(heap_oop);
114 if ((HeapWord*)obj < _boundary) {
115 assert(!_g->to()->is_in_reserved(obj), "Scanning field twice?");
116 oop new_obj = obj->is_forwarded() ? obj->forwardee()
117 : _g->copy_to_survivor_space(obj);
118 RawAccess<OOP_NOT_NULL>::oop_store(p, new_obj);
119 if (is_scanning_a_cld()) {
120 do_cld_barrier();
121 } else if (_gc_barrier) {
122 // Now call parent closure
123 do_barrier(p);
124 }
125 }
126 }
127 }
128
129 inline void FastScanClosure::do_oop_nv(oop* p) { FastScanClosure::do_oop_work(p); }
130 inline void FastScanClosure::do_oop_nv(narrowOop* p) { FastScanClosure::do_oop_work(p); }
131
132 template <class T> void FilteringClosure::do_oop_work(T* p) {
133 T heap_oop = RawAccess<>::oop_load(p);
134 if (!CompressedOops::is_null(heap_oop)) {
135 oop obj = CompressedOops::decode_not_null(heap_oop);
136 if ((HeapWord*)obj < _boundary) {
137 _cl->do_oop(p);
138 }
139 }
140 }
141
142 void FilteringClosure::do_oop_nv(oop* p) { FilteringClosure::do_oop_work(p); }
143 void FilteringClosure::do_oop_nv(narrowOop* p) { FilteringClosure::do_oop_work(p); }
144
145 // Note similarity to ScanClosure; the difference is that
146 // the barrier set is taken care of outside this closure.
147 template <class T> inline void ScanWeakRefClosure::do_oop_work(T* p) {
148 oop obj = RawAccess<OOP_NOT_NULL>::oop_load(p);
149 // weak references are sometimes scanned twice; must check
150 // that to-space doesn't already contain this object
151 if ((HeapWord*)obj < _boundary && !_g->to()->is_in_reserved(obj)) {
152 oop new_obj = obj->is_forwarded() ? obj->forwardee()
153 : _g->copy_to_survivor_space(obj);
154 RawAccess<OOP_NOT_NULL>::oop_store(p, new_obj);
155 }
156 }
157
158 inline void ScanWeakRefClosure::do_oop_nv(oop* p) { ScanWeakRefClosure::do_oop_work(p); }
159 inline void ScanWeakRefClosure::do_oop_nv(narrowOop* p) { ScanWeakRefClosure::do_oop_work(p); }
160
161 #endif // SHARE_VM_GC_SHARED_GENOOPCLOSURES_INLINE_HPP
|
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #ifndef SHARE_VM_GC_SHARED_GENOOPCLOSURES_INLINE_HPP
26 #define SHARE_VM_GC_SHARED_GENOOPCLOSURES_INLINE_HPP
27
28 #include "gc/shared/cardTableRS.hpp"
29 #include "gc/shared/genCollectedHeap.hpp"
30 #include "gc/shared/genOopClosures.hpp"
31 #include "gc/shared/generation.hpp"
32 #include "gc/shared/space.hpp"
33 #include "oops/access.inline.hpp"
34 #include "oops/compressedOops.inline.hpp"
35 #include "oops/oop.inline.hpp"
36 #if INCLUDE_SERIALGC
37 #include "gc/serial/defNewGeneration.inline.hpp"
38 #endif
39
40 inline OopsInGenClosure::OopsInGenClosure(Generation* gen) :
41 ExtendedOopClosure(gen->ref_processor()), _orig_gen(gen), _rs(NULL) {
42 set_generation(gen);
43 }
44
45 inline void OopsInGenClosure::set_generation(Generation* gen) {
46 _gen = gen;
47 _gen_boundary = _gen->reserved().start();
48 // Barrier set for the heap, must be set after heap is initialized
49 if (_rs == NULL) {
50 _rs = GenCollectedHeap::heap()->rem_set();
51 }
52 }
53
54 template <class T> inline void OopsInGenClosure::do_barrier(T* p) {
55 assert(generation()->is_in_reserved(p), "expected ref in generation");
56 T heap_oop = RawAccess<>::oop_load(p);
57 assert(!CompressedOops::is_null(heap_oop), "expected non-null oop");
58 oop obj = CompressedOops::decode_not_null(heap_oop);
63 }
64
65 template <class T> inline void OopsInGenClosure::par_do_barrier(T* p) {
66 assert(generation()->is_in_reserved(p), "expected ref in generation");
67 T heap_oop = RawAccess<>::oop_load(p);
68 assert(!CompressedOops::is_null(heap_oop), "expected non-null oop");
69 oop obj = CompressedOops::decode_not_null(heap_oop);
70 // If p points to a younger generation, mark the card.
71 if ((HeapWord*)obj < gen_boundary()) {
72 rs()->write_ref_field_gc_par(p, obj);
73 }
74 }
75
76 inline void OopsInClassLoaderDataOrGenClosure::do_cld_barrier() {
77 assert(_scanned_cld != NULL, "Must be");
78 if (!_scanned_cld->has_modified_oops()) {
79 _scanned_cld->record_modified_oops();
80 }
81 }
82
83 #if INCLUDE_SERIALGC
84
85 // NOTE! Any changes made here should also be made
86 // in FastScanClosure::do_oop_work()
87 template <class T> inline void ScanClosure::do_oop_work(T* p) {
88 T heap_oop = RawAccess<>::oop_load(p);
89 // Should we copy the obj?
90 if (!CompressedOops::is_null(heap_oop)) {
91 oop obj = CompressedOops::decode_not_null(heap_oop);
92 if ((HeapWord*)obj < _boundary) {
93 assert(!_g->to()->is_in_reserved(obj), "Scanning field twice?");
94 oop new_obj = obj->is_forwarded() ? obj->forwardee()
95 : _g->copy_to_survivor_space(obj);
96 RawAccess<OOP_NOT_NULL>::oop_store(p, new_obj);
97 }
98
99 if (is_scanning_a_cld()) {
100 do_cld_barrier();
101 } else if (_gc_barrier) {
102 // Now call parent closure
103 do_barrier(p);
104 }
116 if (!CompressedOops::is_null(heap_oop)) {
117 oop obj = CompressedOops::decode_not_null(heap_oop);
118 if ((HeapWord*)obj < _boundary) {
119 assert(!_g->to()->is_in_reserved(obj), "Scanning field twice?");
120 oop new_obj = obj->is_forwarded() ? obj->forwardee()
121 : _g->copy_to_survivor_space(obj);
122 RawAccess<OOP_NOT_NULL>::oop_store(p, new_obj);
123 if (is_scanning_a_cld()) {
124 do_cld_barrier();
125 } else if (_gc_barrier) {
126 // Now call parent closure
127 do_barrier(p);
128 }
129 }
130 }
131 }
132
133 inline void FastScanClosure::do_oop_nv(oop* p) { FastScanClosure::do_oop_work(p); }
134 inline void FastScanClosure::do_oop_nv(narrowOop* p) { FastScanClosure::do_oop_work(p); }
135
136 #endif // INCLUDE_SERIALGC
137
138 template <class T> void FilteringClosure::do_oop_work(T* p) {
139 T heap_oop = RawAccess<>::oop_load(p);
140 if (!CompressedOops::is_null(heap_oop)) {
141 oop obj = CompressedOops::decode_not_null(heap_oop);
142 if ((HeapWord*)obj < _boundary) {
143 _cl->do_oop(p);
144 }
145 }
146 }
147
148 void FilteringClosure::do_oop_nv(oop* p) { FilteringClosure::do_oop_work(p); }
149 void FilteringClosure::do_oop_nv(narrowOop* p) { FilteringClosure::do_oop_work(p); }
150
151 #if INCLUDE_SERIALGC
152
153 // Note similarity to ScanClosure; the difference is that
154 // the barrier set is taken care of outside this closure.
155 template <class T> inline void ScanWeakRefClosure::do_oop_work(T* p) {
156 oop obj = RawAccess<OOP_NOT_NULL>::oop_load(p);
157 // weak references are sometimes scanned twice; must check
158 // that to-space doesn't already contain this object
159 if ((HeapWord*)obj < _boundary && !_g->to()->is_in_reserved(obj)) {
160 oop new_obj = obj->is_forwarded() ? obj->forwardee()
161 : _g->copy_to_survivor_space(obj);
162 RawAccess<OOP_NOT_NULL>::oop_store(p, new_obj);
163 }
164 }
165
166 inline void ScanWeakRefClosure::do_oop_nv(oop* p) { ScanWeakRefClosure::do_oop_work(p); }
167 inline void ScanWeakRefClosure::do_oop_nv(narrowOop* p) { ScanWeakRefClosure::do_oop_work(p); }
168
169 #endif // INCLUDE_SERIALGC
170
171 #endif // SHARE_VM_GC_SHARED_GENOOPCLOSURES_INLINE_HPP
|