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) {
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 "utilities/debug.hpp"
45
46 // Defaults to strong claiming.
47 inline MetadataVisitingOopIterateClosure::MetadataVisitingOopIterateClosure(ReferenceDiscoverer* rd) :
48 ClaimMetadataVisitingOopIterateClosure(ClassLoaderData::_claim_strong, rd) {}
49
50 inline void ClaimMetadataVisitingOopIterateClosure::do_cld(ClassLoaderData* cld) {
51 cld->oops_do(this, _claim);
52 }
53
54 inline void ClaimMetadataVisitingOopIterateClosure::do_klass(Klass* k) {
55 ClassLoaderData* cld = k->class_loader_data();
56 if (cld != nullptr) {
132 // when functions pointers are updated.
133 STATIC_ASSERT(sizeof(_function[0]) == sizeof(void*));
134 if (UseCompressedOops) {
135 _function[KlassType::Kind] = &oop_oop_iterate<KlassType, narrowOop>;
136 } else {
137 _function[KlassType::Kind] = &oop_oop_iterate<KlassType, oop>;
138 }
139 }
140
141 template <typename KlassType>
142 void set_resolve_function_and_execute(OopClosureType* cl, oop obj, Klass* k) {
143 set_resolve_function<KlassType>();
144 _function[KlassType::Kind](cl, obj, k);
145 }
146
147 public:
148 FunctionType _function[Klass::KLASS_KIND_COUNT];
149
150 Table(){
151 set_init_function<InstanceKlass>();
152 set_init_function<InlineKlass>();
153 set_init_function<InstanceRefKlass>();
154 set_init_function<InstanceMirrorKlass>();
155 set_init_function<InstanceClassLoaderKlass>();
156 set_init_function<InstanceStackChunkKlass>();
157 set_init_function<ObjArrayKlass>();
158 set_init_function<TypeArrayKlass>();
159 set_init_function<FlatArrayKlass>();
160 }
161 };
162
163 static Table _table;
164 public:
165
166 static FunctionType function(Klass* klass) {
167 return _table._function[klass->kind()];
168 }
169 };
170
171 template <typename OopClosureType>
172 typename OopOopIterateDispatch<OopClosureType>::Table OopOopIterateDispatch<OopClosureType>::_table;
173
174
175 template <typename OopClosureType>
176 class OopOopIterateBoundedDispatch {
177 private:
178 typedef void (*FunctionType)(OopClosureType*, oop, Klass*, MemRegion);
179
197 template <typename KlassType>
198 void set_resolve_function() {
199 if (UseCompressedOops) {
200 _function[KlassType::Kind] = &oop_oop_iterate_bounded<KlassType, narrowOop>;
201 } else {
202 _function[KlassType::Kind] = &oop_oop_iterate_bounded<KlassType, oop>;
203 }
204 }
205
206 template <typename KlassType>
207 void set_resolve_function_and_execute(OopClosureType* cl, oop obj, Klass* k, MemRegion mr) {
208 set_resolve_function<KlassType>();
209 _function[KlassType::Kind](cl, obj, k, mr);
210 }
211
212 public:
213 FunctionType _function[Klass::KLASS_KIND_COUNT];
214
215 Table(){
216 set_init_function<InstanceKlass>();
217 set_init_function<InlineKlass>();
218 set_init_function<InstanceRefKlass>();
219 set_init_function<InstanceMirrorKlass>();
220 set_init_function<InstanceClassLoaderKlass>();
221 set_init_function<InstanceStackChunkKlass>();
222 set_init_function<ObjArrayKlass>();
223 set_init_function<TypeArrayKlass>();
224 set_init_function<FlatArrayKlass>();
225 }
226 };
227
228 static Table _table;
229 public:
230
231 static FunctionType function(Klass* klass) {
232 return _table._function[klass->kind()];
233 }
234 };
235
236 template <typename OopClosureType>
237 typename OopOopIterateBoundedDispatch<OopClosureType>::Table OopOopIterateBoundedDispatch<OopClosureType>::_table;
238
239
240 template <typename OopClosureType>
241 class OopOopIterateBackwardsDispatch {
242 private:
243 typedef void (*FunctionType)(OopClosureType*, oop, Klass*);
244
262 template <typename KlassType>
263 void set_resolve_function() {
264 if (UseCompressedOops) {
265 _function[KlassType::Kind] = &oop_oop_iterate_backwards<KlassType, narrowOop>;
266 } else {
267 _function[KlassType::Kind] = &oop_oop_iterate_backwards<KlassType, oop>;
268 }
269 }
270
271 template <typename KlassType>
272 void set_resolve_function_and_execute(OopClosureType* cl, oop obj, Klass* k) {
273 set_resolve_function<KlassType>();
274 _function[KlassType::Kind](cl, obj, k);
275 }
276
277 public:
278 FunctionType _function[Klass::KLASS_KIND_COUNT];
279
280 Table(){
281 set_init_function<InstanceKlass>();
282 set_init_function<InlineKlass>();
283 set_init_function<InstanceRefKlass>();
284 set_init_function<InstanceMirrorKlass>();
285 set_init_function<InstanceClassLoaderKlass>();
286 set_init_function<InstanceStackChunkKlass>();
287 set_init_function<ObjArrayKlass>();
288 set_init_function<TypeArrayKlass>();
289 set_init_function<FlatArrayKlass>();
290 }
291 };
292
293 static Table _table;
294 public:
295
296 static FunctionType function(Klass* klass) {
297 return _table._function[klass->kind()];
298 }
299 };
300
301 template <typename OopClosureType>
302 typename OopOopIterateBackwardsDispatch<OopClosureType>::Table OopOopIterateBackwardsDispatch<OopClosureType>::_table;
303
304
305 template <typename OopClosureType>
306 void OopIteratorClosureDispatch::oop_oop_iterate(OopClosureType* cl, oop obj, Klass* klass) {
307 OopOopIterateDispatch<OopClosureType>::function(klass)(cl, obj, klass);
308 }
309
|