< prev index next >

src/hotspot/share/memory/iterator.inline.hpp

Print this page

 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_MEMORY_ITERATOR_INLINE_HPP
 26 #define SHARE_MEMORY_ITERATOR_INLINE_HPP
 27 
 28 #include "memory/iterator.hpp"
 29 
 30 #include "classfile/classLoaderData.hpp"
 31 #include "code/nmethod.hpp"
 32 #include "oops/access.inline.hpp"
 33 #include "oops/compressedOops.inline.hpp"

 34 #include "oops/instanceClassLoaderKlass.inline.hpp"
 35 #include "oops/instanceKlass.inline.hpp"
 36 #include "oops/instanceMirrorKlass.inline.hpp"
 37 #include "oops/instanceRefKlass.inline.hpp"
 38 #include "oops/instanceStackChunkKlass.inline.hpp"
 39 #include "oops/klass.hpp"
 40 #include "oops/objArrayKlass.inline.hpp"

 41 #include "oops/typeArrayKlass.inline.hpp"
 42 #include "utilities/debug.hpp"
 43 
 44 // Defaults to strong claiming.
 45 inline MetadataVisitingOopIterateClosure::MetadataVisitingOopIterateClosure(ReferenceDiscoverer* rd) :
 46     ClaimMetadataVisitingOopIterateClosure(ClassLoaderData::_claim_strong, rd) {}
 47 
 48 inline void ClaimMetadataVisitingOopIterateClosure::do_cld(ClassLoaderData* cld) {
 49   cld->oops_do(this, _claim);
 50 }
 51 
 52 inline void ClaimMetadataVisitingOopIterateClosure::do_klass(Klass* k) {
 53   ClaimMetadataVisitingOopIterateClosure::do_cld(k->class_loader_data());
 54 }
 55 
 56 inline void ClaimMetadataVisitingOopIterateClosure::do_nmethod(nmethod* nm) {
 57   nm->follow_nmethod(this);
 58 }
 59 
 60 inline void ClaimMetadataVisitingOopIterateClosure::do_method(Method* m) {

125       // when functions pointers are updated.
126       STATIC_ASSERT(sizeof(_function[0]) == sizeof(void*));
127       if (UseCompressedOops) {
128         _function[KlassType::Kind] = &oop_oop_iterate<KlassType, narrowOop>;
129       } else {
130         _function[KlassType::Kind] = &oop_oop_iterate<KlassType, oop>;
131       }
132     }
133 
134     template <typename KlassType>
135     void set_resolve_function_and_execute(OopClosureType* cl, oop obj, Klass* k) {
136       set_resolve_function<KlassType>();
137       _function[KlassType::Kind](cl, obj, k);
138     }
139 
140   public:
141     FunctionType _function[Klass::KLASS_KIND_COUNT];
142 
143     Table(){
144       set_init_function<InstanceKlass>();

145       set_init_function<InstanceRefKlass>();
146       set_init_function<InstanceMirrorKlass>();
147       set_init_function<InstanceClassLoaderKlass>();
148       set_init_function<InstanceStackChunkKlass>();
149       set_init_function<ObjArrayKlass>();
150       set_init_function<TypeArrayKlass>();


151     }
152   };
153 
154   static Table _table;
155 public:
156 
157   static FunctionType function(Klass* klass) {
158     return _table._function[klass->kind()];
159   }
160 };
161 
162 template <typename OopClosureType>
163 typename OopOopIterateDispatch<OopClosureType>::Table OopOopIterateDispatch<OopClosureType>::_table;
164 
165 
166 template <typename OopClosureType>
167 class OopOopIterateBoundedDispatch {
168 private:
169   typedef void (*FunctionType)(OopClosureType*, oop, Klass*, MemRegion);
170 

188     template <typename KlassType>
189     void set_resolve_function() {
190       if (UseCompressedOops) {
191         _function[KlassType::Kind] = &oop_oop_iterate_bounded<KlassType, narrowOop>;
192       } else {
193         _function[KlassType::Kind] = &oop_oop_iterate_bounded<KlassType, oop>;
194       }
195     }
196 
197     template <typename KlassType>
198     void set_resolve_function_and_execute(OopClosureType* cl, oop obj, Klass* k, MemRegion mr) {
199       set_resolve_function<KlassType>();
200       _function[KlassType::Kind](cl, obj, k, mr);
201     }
202 
203   public:
204     FunctionType _function[Klass::KLASS_KIND_COUNT];
205 
206     Table(){
207       set_init_function<InstanceKlass>();

208       set_init_function<InstanceRefKlass>();
209       set_init_function<InstanceMirrorKlass>();
210       set_init_function<InstanceClassLoaderKlass>();
211       set_init_function<InstanceStackChunkKlass>();
212       set_init_function<ObjArrayKlass>();
213       set_init_function<TypeArrayKlass>();


214     }
215   };
216 
217   static Table _table;
218 public:
219 
220   static FunctionType function(Klass* klass) {
221     return _table._function[klass->kind()];
222   }
223 };
224 
225 template <typename OopClosureType>
226 typename OopOopIterateBoundedDispatch<OopClosureType>::Table OopOopIterateBoundedDispatch<OopClosureType>::_table;
227 
228 
229 template <typename OopClosureType>
230 class OopOopIterateBackwardsDispatch {
231 private:
232   typedef void (*FunctionType)(OopClosureType*, oop, Klass*);
233 

251     template <typename KlassType>
252     void set_resolve_function() {
253       if (UseCompressedOops) {
254         _function[KlassType::Kind] = &oop_oop_iterate_backwards<KlassType, narrowOop>;
255       } else {
256         _function[KlassType::Kind] = &oop_oop_iterate_backwards<KlassType, oop>;
257       }
258     }
259 
260     template <typename KlassType>
261     void set_resolve_function_and_execute(OopClosureType* cl, oop obj, Klass* k) {
262       set_resolve_function<KlassType>();
263       _function[KlassType::Kind](cl, obj, k);
264     }
265 
266   public:
267     FunctionType _function[Klass::KLASS_KIND_COUNT];
268 
269     Table(){
270       set_init_function<InstanceKlass>();

271       set_init_function<InstanceRefKlass>();
272       set_init_function<InstanceMirrorKlass>();
273       set_init_function<InstanceClassLoaderKlass>();
274       set_init_function<InstanceStackChunkKlass>();
275       set_init_function<ObjArrayKlass>();
276       set_init_function<TypeArrayKlass>();


277     }
278   };
279 
280   static Table _table;
281 public:
282 
283   static FunctionType function(Klass* klass) {
284     return _table._function[klass->kind()];
285   }
286 };
287 
288 template <typename OopClosureType>
289 typename OopOopIterateBackwardsDispatch<OopClosureType>::Table OopOopIterateBackwardsDispatch<OopClosureType>::_table;
290 
291 
292 template <typename OopClosureType>
293 void OopIteratorClosureDispatch::oop_oop_iterate(OopClosureType* cl, oop obj, Klass* klass) {
294   OopOopIterateDispatch<OopClosureType>::function(klass)(cl, obj, klass);
295 }
296 

 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_MEMORY_ITERATOR_INLINE_HPP
 26 #define SHARE_MEMORY_ITERATOR_INLINE_HPP
 27 
 28 #include "memory/iterator.hpp"
 29 
 30 #include "classfile/classLoaderData.hpp"
 31 #include "code/nmethod.hpp"
 32 #include "oops/access.inline.hpp"
 33 #include "oops/compressedOops.inline.hpp"
 34 #include "oops/flatArrayKlass.inline.hpp"
 35 #include "oops/instanceClassLoaderKlass.inline.hpp"
 36 #include "oops/instanceKlass.inline.hpp"
 37 #include "oops/instanceMirrorKlass.inline.hpp"
 38 #include "oops/instanceRefKlass.inline.hpp"
 39 #include "oops/instanceStackChunkKlass.inline.hpp"
 40 #include "oops/klass.hpp"
 41 #include "oops/objArrayKlass.inline.hpp"
 42 #include "oops/refArrayKlass.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   ClaimMetadataVisitingOopIterateClosure::do_cld(k->class_loader_data());
 56 }
 57 
 58 inline void ClaimMetadataVisitingOopIterateClosure::do_nmethod(nmethod* nm) {
 59   nm->follow_nmethod(this);
 60 }
 61 
 62 inline void ClaimMetadataVisitingOopIterateClosure::do_method(Method* m) {

127       // when functions pointers are updated.
128       STATIC_ASSERT(sizeof(_function[0]) == sizeof(void*));
129       if (UseCompressedOops) {
130         _function[KlassType::Kind] = &oop_oop_iterate<KlassType, narrowOop>;
131       } else {
132         _function[KlassType::Kind] = &oop_oop_iterate<KlassType, oop>;
133       }
134     }
135 
136     template <typename KlassType>
137     void set_resolve_function_and_execute(OopClosureType* cl, oop obj, Klass* k) {
138       set_resolve_function<KlassType>();
139       _function[KlassType::Kind](cl, obj, k);
140     }
141 
142   public:
143     FunctionType _function[Klass::KLASS_KIND_COUNT];
144 
145     Table(){
146       set_init_function<InstanceKlass>();
147       set_init_function<InlineKlass>();
148       set_init_function<InstanceRefKlass>();
149       set_init_function<InstanceMirrorKlass>();
150       set_init_function<InstanceClassLoaderKlass>();
151       set_init_function<InstanceStackChunkKlass>();
152       set_init_function<ObjArrayKlass>();
153       set_init_function<TypeArrayKlass>();
154       set_init_function<FlatArrayKlass>();
155       set_init_function<RefArrayKlass>();
156     }
157   };
158 
159   static Table _table;
160 public:
161 
162   static FunctionType function(Klass* klass) {
163     return _table._function[klass->kind()];
164   }
165 };
166 
167 template <typename OopClosureType>
168 typename OopOopIterateDispatch<OopClosureType>::Table OopOopIterateDispatch<OopClosureType>::_table;
169 
170 
171 template <typename OopClosureType>
172 class OopOopIterateBoundedDispatch {
173 private:
174   typedef void (*FunctionType)(OopClosureType*, oop, Klass*, MemRegion);
175 

193     template <typename KlassType>
194     void set_resolve_function() {
195       if (UseCompressedOops) {
196         _function[KlassType::Kind] = &oop_oop_iterate_bounded<KlassType, narrowOop>;
197       } else {
198         _function[KlassType::Kind] = &oop_oop_iterate_bounded<KlassType, oop>;
199       }
200     }
201 
202     template <typename KlassType>
203     void set_resolve_function_and_execute(OopClosureType* cl, oop obj, Klass* k, MemRegion mr) {
204       set_resolve_function<KlassType>();
205       _function[KlassType::Kind](cl, obj, k, mr);
206     }
207 
208   public:
209     FunctionType _function[Klass::KLASS_KIND_COUNT];
210 
211     Table(){
212       set_init_function<InstanceKlass>();
213       set_init_function<InlineKlass>();
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       set_init_function<FlatArrayKlass>();
221       set_init_function<RefArrayKlass>();
222     }
223   };
224 
225   static Table _table;
226 public:
227 
228   static FunctionType function(Klass* klass) {
229     return _table._function[klass->kind()];
230   }
231 };
232 
233 template <typename OopClosureType>
234 typename OopOopIterateBoundedDispatch<OopClosureType>::Table OopOopIterateBoundedDispatch<OopClosureType>::_table;
235 
236 
237 template <typename OopClosureType>
238 class OopOopIterateBackwardsDispatch {
239 private:
240   typedef void (*FunctionType)(OopClosureType*, oop, Klass*);
241 

259     template <typename KlassType>
260     void set_resolve_function() {
261       if (UseCompressedOops) {
262         _function[KlassType::Kind] = &oop_oop_iterate_backwards<KlassType, narrowOop>;
263       } else {
264         _function[KlassType::Kind] = &oop_oop_iterate_backwards<KlassType, oop>;
265       }
266     }
267 
268     template <typename KlassType>
269     void set_resolve_function_and_execute(OopClosureType* cl, oop obj, Klass* k) {
270       set_resolve_function<KlassType>();
271       _function[KlassType::Kind](cl, obj, k);
272     }
273 
274   public:
275     FunctionType _function[Klass::KLASS_KIND_COUNT];
276 
277     Table(){
278       set_init_function<InstanceKlass>();
279       set_init_function<InlineKlass>();
280       set_init_function<InstanceRefKlass>();
281       set_init_function<InstanceMirrorKlass>();
282       set_init_function<InstanceClassLoaderKlass>();
283       set_init_function<InstanceStackChunkKlass>();
284       set_init_function<ObjArrayKlass>();
285       set_init_function<TypeArrayKlass>();
286       set_init_function<FlatArrayKlass>();
287       set_init_function<RefArrayKlass>();
288     }
289   };
290 
291   static Table _table;
292 public:
293 
294   static FunctionType function(Klass* klass) {
295     return _table._function[klass->kind()];
296   }
297 };
298 
299 template <typename OopClosureType>
300 typename OopOopIterateBackwardsDispatch<OopClosureType>::Table OopOopIterateBackwardsDispatch<OopClosureType>::_table;
301 
302 
303 template <typename OopClosureType>
304 void OopIteratorClosureDispatch::oop_oop_iterate(OopClosureType* cl, oop obj, Klass* klass) {
305   OopOopIterateDispatch<OopClosureType>::function(klass)(cl, obj, klass);
306 }
307 
< prev index next >