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_MEMORY_ITERATOR_INLINE_HPP
26 #define SHARE_MEMORY_ITERATOR_INLINE_HPP
27
28 #include "memory/iterator.hpp"
29
30 #include "cds/aotLinkedClassBulkLoader.hpp"
31 #include "classfile/classLoaderData.hpp"
32 #include "code/nmethod.hpp"
33 #include "oops/access.inline.hpp"
34 #include "oops/compressedOops.inline.hpp"
35 #include "oops/klass.hpp"
36 #include "oops/instanceKlass.inline.hpp"
37 #include "oops/instanceMirrorKlass.inline.hpp"
38 #include "oops/instanceClassLoaderKlass.inline.hpp"
39 #include "oops/instanceRefKlass.inline.hpp"
40 #include "oops/instanceStackChunkKlass.inline.hpp"
41 #include "oops/objArrayKlass.inline.hpp"
42 #include "oops/typeArrayKlass.inline.hpp"
43 #include "utilities/debug.hpp"
44
45 // Defaults to strong claiming.
46 inline MetadataVisitingOopIterateClosure::MetadataVisitingOopIterateClosure(ReferenceDiscoverer* rd) :
47 ClaimMetadataVisitingOopIterateClosure(ClassLoaderData::_claim_strong, rd) {}
48
49 inline void ClaimMetadataVisitingOopIterateClosure::do_cld(ClassLoaderData* cld) {
50 cld->oops_do(this, _claim);
51 }
52
53 inline void ClaimMetadataVisitingOopIterateClosure::do_klass(Klass* k) {
54 ClassLoaderData* cld = k->class_loader_data();
55 if (cld != nullptr) {
56 ClaimMetadataVisitingOopIterateClosure::do_cld(cld);
57 } else {
58 assert(AOTLinkedClassBulkLoader::is_pending_aot_linked_class(k), "sanity");
59 }
60 }
61
62 inline void ClaimMetadataVisitingOopIterateClosure::do_nmethod(nmethod* nm) {
131 // when functions pointers are updated.
132 STATIC_ASSERT(sizeof(_function[0]) == sizeof(void*));
133 if (UseCompressedOops) {
134 _function[KlassType::Kind] = &oop_oop_iterate<KlassType, narrowOop>;
135 } else {
136 _function[KlassType::Kind] = &oop_oop_iterate<KlassType, oop>;
137 }
138 }
139
140 template <typename KlassType>
141 void set_resolve_function_and_execute(OopClosureType* cl, oop obj, Klass* k) {
142 set_resolve_function<KlassType>();
143 _function[KlassType::Kind](cl, obj, k);
144 }
145
146 public:
147 FunctionType _function[Klass::KLASS_KIND_COUNT];
148
149 Table(){
150 set_init_function<InstanceKlass>();
151 set_init_function<InstanceRefKlass>();
152 set_init_function<InstanceMirrorKlass>();
153 set_init_function<InstanceClassLoaderKlass>();
154 set_init_function<InstanceStackChunkKlass>();
155 set_init_function<ObjArrayKlass>();
156 set_init_function<TypeArrayKlass>();
157 }
158 };
159
160 static Table _table;
161 public:
162
163 static FunctionType function(Klass* klass) {
164 return _table._function[klass->kind()];
165 }
166 };
167
168 template <typename OopClosureType>
169 typename OopOopIterateDispatch<OopClosureType>::Table OopOopIterateDispatch<OopClosureType>::_table;
170
171
172 template <typename OopClosureType>
173 class OopOopIterateBoundedDispatch {
174 private:
175 typedef void (*FunctionType)(OopClosureType*, oop, Klass*, MemRegion);
176
194 template <typename KlassType>
195 void set_resolve_function() {
196 if (UseCompressedOops) {
197 _function[KlassType::Kind] = &oop_oop_iterate_bounded<KlassType, narrowOop>;
198 } else {
199 _function[KlassType::Kind] = &oop_oop_iterate_bounded<KlassType, oop>;
200 }
201 }
202
203 template <typename KlassType>
204 void set_resolve_function_and_execute(OopClosureType* cl, oop obj, Klass* k, MemRegion mr) {
205 set_resolve_function<KlassType>();
206 _function[KlassType::Kind](cl, obj, k, mr);
207 }
208
209 public:
210 FunctionType _function[Klass::KLASS_KIND_COUNT];
211
212 Table(){
213 set_init_function<InstanceKlass>();
214 set_init_function<InstanceRefKlass>();
215 set_init_function<InstanceMirrorKlass>();
216 set_init_function<InstanceClassLoaderKlass>();
217 set_init_function<InstanceStackChunkKlass>();
218 set_init_function<ObjArrayKlass>();
219 set_init_function<TypeArrayKlass>();
220 }
221 };
222
223 static Table _table;
224 public:
225
226 static FunctionType function(Klass* klass) {
227 return _table._function[klass->kind()];
228 }
229 };
230
231 template <typename OopClosureType>
232 typename OopOopIterateBoundedDispatch<OopClosureType>::Table OopOopIterateBoundedDispatch<OopClosureType>::_table;
233
234
235 template <typename OopClosureType>
236 class OopOopIterateBackwardsDispatch {
237 private:
238 typedef void (*FunctionType)(OopClosureType*, oop, Klass*);
239
257 template <typename KlassType>
258 void set_resolve_function() {
259 if (UseCompressedOops) {
260 _function[KlassType::Kind] = &oop_oop_iterate_backwards<KlassType, narrowOop>;
261 } else {
262 _function[KlassType::Kind] = &oop_oop_iterate_backwards<KlassType, oop>;
263 }
264 }
265
266 template <typename KlassType>
267 void set_resolve_function_and_execute(OopClosureType* cl, oop obj, Klass* k) {
268 set_resolve_function<KlassType>();
269 _function[KlassType::Kind](cl, obj, k);
270 }
271
272 public:
273 FunctionType _function[Klass::KLASS_KIND_COUNT];
274
275 Table(){
276 set_init_function<InstanceKlass>();
277 set_init_function<InstanceRefKlass>();
278 set_init_function<InstanceMirrorKlass>();
279 set_init_function<InstanceClassLoaderKlass>();
280 set_init_function<InstanceStackChunkKlass>();
281 set_init_function<ObjArrayKlass>();
282 set_init_function<TypeArrayKlass>();
283 }
284 };
285
286 static Table _table;
287 public:
288
289 static FunctionType function(Klass* klass) {
290 return _table._function[klass->kind()];
291 }
292 };
293
294 template <typename OopClosureType>
295 typename OopOopIterateBackwardsDispatch<OopClosureType>::Table OopOopIterateBackwardsDispatch<OopClosureType>::_table;
296
297
298 template <typename OopClosureType>
299 void OopIteratorClosureDispatch::oop_oop_iterate(OopClosureType* cl, oop obj, Klass* klass) {
300 OopOopIterateDispatch<OopClosureType>::function(klass)(cl, obj, klass);
301 }
302
|
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_MEMORY_ITERATOR_INLINE_HPP
26 #define SHARE_MEMORY_ITERATOR_INLINE_HPP
27
28 #include "memory/iterator.hpp"
29
30 #include "cds/aotLinkedClassBulkLoader.hpp"
31 #include "classfile/classLoaderData.hpp"
32 #include "code/nmethod.hpp"
33 #include "oops/access.inline.hpp"
34 #include "oops/compressedOops.inline.hpp"
35 #include "oops/klass.hpp"
36 #include "oops/flatArrayKlass.inline.hpp"
37 #include "oops/instanceKlass.inline.hpp"
38 #include "oops/instanceMirrorKlass.inline.hpp"
39 #include "oops/instanceClassLoaderKlass.inline.hpp"
40 #include "oops/instanceRefKlass.inline.hpp"
41 #include "oops/instanceStackChunkKlass.inline.hpp"
42 #include "oops/objArrayKlass.inline.hpp"
43 #include "oops/typeArrayKlass.inline.hpp"
44 #include "oops/refArrayKlass.inline.hpp"
45 #include "utilities/debug.hpp"
46
47 // Defaults to strong claiming.
48 inline MetadataVisitingOopIterateClosure::MetadataVisitingOopIterateClosure(ReferenceDiscoverer* rd) :
49 ClaimMetadataVisitingOopIterateClosure(ClassLoaderData::_claim_strong, rd) {}
50
51 inline void ClaimMetadataVisitingOopIterateClosure::do_cld(ClassLoaderData* cld) {
52 cld->oops_do(this, _claim);
53 }
54
55 inline void ClaimMetadataVisitingOopIterateClosure::do_klass(Klass* k) {
56 ClassLoaderData* cld = k->class_loader_data();
57 if (cld != nullptr) {
58 ClaimMetadataVisitingOopIterateClosure::do_cld(cld);
59 } else {
60 assert(AOTLinkedClassBulkLoader::is_pending_aot_linked_class(k), "sanity");
61 }
62 }
63
64 inline void ClaimMetadataVisitingOopIterateClosure::do_nmethod(nmethod* nm) {
133 // when functions pointers are updated.
134 STATIC_ASSERT(sizeof(_function[0]) == sizeof(void*));
135 if (UseCompressedOops) {
136 _function[KlassType::Kind] = &oop_oop_iterate<KlassType, narrowOop>;
137 } else {
138 _function[KlassType::Kind] = &oop_oop_iterate<KlassType, oop>;
139 }
140 }
141
142 template <typename KlassType>
143 void set_resolve_function_and_execute(OopClosureType* cl, oop obj, Klass* k) {
144 set_resolve_function<KlassType>();
145 _function[KlassType::Kind](cl, obj, k);
146 }
147
148 public:
149 FunctionType _function[Klass::KLASS_KIND_COUNT];
150
151 Table(){
152 set_init_function<InstanceKlass>();
153 set_init_function<InlineKlass>();
154 set_init_function<InstanceRefKlass>();
155 set_init_function<InstanceMirrorKlass>();
156 set_init_function<InstanceClassLoaderKlass>();
157 set_init_function<InstanceStackChunkKlass>();
158 set_init_function<ObjArrayKlass>();
159 set_init_function<TypeArrayKlass>();
160 set_init_function<FlatArrayKlass>();
161 set_init_function<RefArrayKlass>();
162 }
163 };
164
165 static Table _table;
166 public:
167
168 static FunctionType function(Klass* klass) {
169 return _table._function[klass->kind()];
170 }
171 };
172
173 template <typename OopClosureType>
174 typename OopOopIterateDispatch<OopClosureType>::Table OopOopIterateDispatch<OopClosureType>::_table;
175
176
177 template <typename OopClosureType>
178 class OopOopIterateBoundedDispatch {
179 private:
180 typedef void (*FunctionType)(OopClosureType*, oop, Klass*, MemRegion);
181
199 template <typename KlassType>
200 void set_resolve_function() {
201 if (UseCompressedOops) {
202 _function[KlassType::Kind] = &oop_oop_iterate_bounded<KlassType, narrowOop>;
203 } else {
204 _function[KlassType::Kind] = &oop_oop_iterate_bounded<KlassType, oop>;
205 }
206 }
207
208 template <typename KlassType>
209 void set_resolve_function_and_execute(OopClosureType* cl, oop obj, Klass* k, MemRegion mr) {
210 set_resolve_function<KlassType>();
211 _function[KlassType::Kind](cl, obj, k, mr);
212 }
213
214 public:
215 FunctionType _function[Klass::KLASS_KIND_COUNT];
216
217 Table(){
218 set_init_function<InstanceKlass>();
219 set_init_function<InlineKlass>();
220 set_init_function<InstanceRefKlass>();
221 set_init_function<InstanceMirrorKlass>();
222 set_init_function<InstanceClassLoaderKlass>();
223 set_init_function<InstanceStackChunkKlass>();
224 set_init_function<ObjArrayKlass>();
225 set_init_function<TypeArrayKlass>();
226 set_init_function<FlatArrayKlass>();
227 set_init_function<RefArrayKlass>();
228 }
229 };
230
231 static Table _table;
232 public:
233
234 static FunctionType function(Klass* klass) {
235 return _table._function[klass->kind()];
236 }
237 };
238
239 template <typename OopClosureType>
240 typename OopOopIterateBoundedDispatch<OopClosureType>::Table OopOopIterateBoundedDispatch<OopClosureType>::_table;
241
242
243 template <typename OopClosureType>
244 class OopOopIterateBackwardsDispatch {
245 private:
246 typedef void (*FunctionType)(OopClosureType*, oop, Klass*);
247
265 template <typename KlassType>
266 void set_resolve_function() {
267 if (UseCompressedOops) {
268 _function[KlassType::Kind] = &oop_oop_iterate_backwards<KlassType, narrowOop>;
269 } else {
270 _function[KlassType::Kind] = &oop_oop_iterate_backwards<KlassType, oop>;
271 }
272 }
273
274 template <typename KlassType>
275 void set_resolve_function_and_execute(OopClosureType* cl, oop obj, Klass* k) {
276 set_resolve_function<KlassType>();
277 _function[KlassType::Kind](cl, obj, k);
278 }
279
280 public:
281 FunctionType _function[Klass::KLASS_KIND_COUNT];
282
283 Table(){
284 set_init_function<InstanceKlass>();
285 set_init_function<InlineKlass>();
286 set_init_function<InstanceRefKlass>();
287 set_init_function<InstanceMirrorKlass>();
288 set_init_function<InstanceClassLoaderKlass>();
289 set_init_function<InstanceStackChunkKlass>();
290 set_init_function<ObjArrayKlass>();
291 set_init_function<TypeArrayKlass>();
292 set_init_function<FlatArrayKlass>();
293 set_init_function<RefArrayKlass>();
294 }
295 };
296
297 static Table _table;
298 public:
299
300 static FunctionType function(Klass* klass) {
301 return _table._function[klass->kind()];
302 }
303 };
304
305 template <typename OopClosureType>
306 typename OopOopIterateBackwardsDispatch<OopClosureType>::Table OopOopIterateBackwardsDispatch<OopClosureType>::_table;
307
308
309 template <typename OopClosureType>
310 void OopIteratorClosureDispatch::oop_oop_iterate(OopClosureType* cl, oop obj, Klass* klass) {
311 OopOopIterateDispatch<OopClosureType>::function(klass)(cl, obj, klass);
312 }
313
|