< prev index next >

src/share/vm/memory/specialized_oop_closures.hpp

Print this page
rev 7183 : autospecialized oop_iterate using SFINAE and templates
rev 7184 : cross platform compiler friendly enum declaration

*** 24,33 **** --- 24,34 ---- #ifndef SHARE_VM_MEMORY_SPECIALIZED_OOP_CLOSURES_HPP #define SHARE_VM_MEMORY_SPECIALIZED_OOP_CLOSURES_HPP #include "utilities/macros.hpp" + #include "utilities/templateIdioms.hpp" #if INCLUDE_ALL_GCS #include "gc_implementation/g1/g1_specialized_oop_closures.hpp" #endif // INCLUDE_ALL_GCS // The following OopClosure types get specialized versions of
*** 67,76 **** --- 68,96 ---- // category.) // This is split into several because of a Visual C++ 6.0 compiler bug // where very long macros cause the compiler to crash + // These two macros are for explicitly declaring base classes for closures that + // have no do_oop implementation and hence need virtual calls. + // It should never be necessary to add more closure types except the base + // classes here as auto specialization mechanism automatically + // checks that the declared closure type also has its own declaration + // of the specialized calls. + #define UNSPECIALIZED_OOP_OOP_ITERATE_CLOSURES(f) \ + f(ExtendedOopClosure) \ + f(OopClosure) + + #define UNSPECIALIZED_DO_METADATA_CLOSURES(f) \ + f(ExtendedOopClosure) + + #define FORWARD_DECLARE_CLOSURE(OopClosureType) \ + class OopClosureType; + + UNSPECIALIZED_OOP_OOP_ITERATE_CLOSURES(FORWARD_DECLARE_CLOSURE) + UNSPECIALIZED_DO_METADATA_CLOSURES(FORWARD_DECLARE_CLOSURE) + // Some other heap might define further specialized closures. #ifndef FURTHER_SPECIALIZED_OOP_OOP_ITERATE_CLOSURES #define FURTHER_SPECIALIZED_OOP_OOP_ITERATE_CLOSURES(f) \ /* None */ #endif
*** 192,201 **** --- 212,335 ---- SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES(f) // For keeping stats on effectiveness. #define ENABLE_SPECIALIZATION_STATS 0 + typedef enum DispatchTag { + _unknown_klass = 1, + _instance_mirror_klass, + _instance_class_loader_klass, + _instance_ref_klass + } DispatchTag; + + /** + * The OopClosureDispatcher is a proxy class that automatically figures out + * which OopClosure member function to call. It first checks for overridden + * specializations using macros (only needed for OopClosure and + * ExtendedOopClosure. These will result in virtual calls. + * Otherwise if it's a subclass of these two, it will first try to call + * the corresponding _nv member function for backward compatibility. + * Otherwise, it will check for a a normal non nv declaration, in the derived + * class (not the super class). If it exists, it will be called, otherwise + * it resorts to a normal virtual call. + */ + class OopClosureDispatcher : AllStatic { + template<class OopClosureType, class OopType> + static typename enable_if<!has_member_function_do_oop_nv<OopClosureType, void (OopClosureType::*)(OopType *obj)>::value, void>::type + do_oop_internal_try_nv(OopClosureType *cl, OopType *obj); + + template<class OopClosureType, class OopType> + static typename enable_if<has_member_function_do_oop_nv<OopClosureType, void (OopClosureType::*)(OopType *obj)>::value, void>::type + do_oop_internal_try_nv(OopClosureType *cl, OopType *obj); + + template<class OopClosureType, class OopType> + static typename enable_if<!has_member_function_do_oop<OopClosureType, void (OopClosureType::*)(OopType *obj)>::value, void>::type + do_oop_internal_try_v(OopClosureType *cl, OopType *obj); + + template<class OopClosureType, class OopType> + static typename enable_if<has_member_function_do_oop<OopClosureType, void (OopClosureType::*)(OopType *obj)>::value, void>::type + do_oop_internal_try_v(OopClosureType *cl, OopType *obj); + + template<class OopClosureType> + static typename enable_if<!has_member_function_do_metadata_nv<OopClosureType, bool (OopClosureType::*)()>::value, bool>::type + do_metadata_internal_try_nv(OopClosureType *cl); + + template<class OopClosureType> + static typename enable_if<has_member_function_do_metadata_nv<OopClosureType, bool (OopClosureType::*)()>::value, bool>::type + do_metadata_internal_try_nv(OopClosureType *cl); + + template<class OopClosureType> + static typename enable_if<!has_member_function_do_metadata<OopClosureType, bool (OopClosureType::*)()>::value, bool>::type + do_metadata_internal_try_v(OopClosureType *cl); + + template<class OopClosureType> + static typename enable_if<has_member_function_do_metadata<OopClosureType, bool (OopClosureType::*)()>::value, bool>::type + do_metadata_internal_try_v(OopClosureType *cl); + + template<class OopClosureType> + static typename enable_if<!has_member_function_do_klass_nv<OopClosureType, void (OopClosureType::*)(Klass*)>::value, void>::type + do_klass_internal_try_nv(OopClosureType *cl, Klass *klass); + + template<class OopClosureType> + static typename enable_if<has_member_function_do_klass_nv<OopClosureType, void (OopClosureType::*)(Klass*)>::value, void>::type + do_klass_internal_try_nv(OopClosureType *cl, Klass *klass); + + template<class OopClosureType> + static typename enable_if<!has_member_function_do_klass<OopClosureType, void (OopClosureType::*)(Klass*)>::value, void>::type + do_klass_internal_try_v(OopClosureType *cl, Klass *klass); + + template<class OopClosureType> + static typename enable_if<has_member_function_do_klass<OopClosureType, void (OopClosureType::*)(Klass*)>::value, void>::type + do_klass_internal_try_v(OopClosureType *cl, Klass *klass); + + template<class OopClosureType> + static typename enable_if<!has_member_function_do_class_loader_data_nv<OopClosureType, void (OopClosureType::*)(ClassLoaderData*)>::value, void>::type + do_class_loader_data_internal_try_nv(OopClosureType *cl, ClassLoaderData *cld); + + template<class OopClosureType> + static typename enable_if<has_member_function_do_class_loader_data_nv<OopClosureType, void (OopClosureType::*)(ClassLoaderData*)>::value, void>::type + do_class_loader_data_internal_try_nv(OopClosureType *cl, ClassLoaderData *cld); + + template<class OopClosureType> + static typename enable_if<!has_member_function_do_class_loader_data<OopClosureType, void (OopClosureType::*)(ClassLoaderData*)>::value, void>::type + do_class_loader_data_internal_try_v(OopClosureType *cl, ClassLoaderData *cld); + + template<class OopClosureType> + static typename enable_if<has_member_function_do_class_loader_data<OopClosureType, void (OopClosureType::*)(ClassLoaderData*)>::value, void>::type + do_class_loader_data_internal_try_v(OopClosureType *cl, ClassLoaderData *cld); + + template<class OopClosureType, class OopType> + static void do_oop_internal(OopClosureType *cl, OopType *obj); + + template<class OopClosureType> + static bool do_metadata_internal(OopClosureType *cl); + + template<class OopClosureType> + static void do_klass_internal(OopClosureType *cl, Klass *klass); + + template<class OopClosureType> + static void do_class_loader_data_internal(OopClosureType *cl, ClassLoaderData *cld); + + public: + // Make sure we only dispatch to OopClosure subtypes, otherwise compiler error + template<class OopClosureType, class OopType> + static typename enable_if<is_kind_of<OopClosure, OopClosureType>::value, void>::type + do_oop(OopClosureType *cl, OopType *obj); + + // Only do metadata stuff on ExtendedOopClosure, otherwise compiler error + template<class OopClosureType> + static typename enable_if<is_kind_of<ExtendedOopClosure, OopClosureType>::value, bool>::type + do_metadata(OopClosureType *cl); + + template<class OopClosureType> + static typename enable_if<is_kind_of<ExtendedOopClosure, OopClosureType>::value, void>::type + do_klass(OopClosureType *cl, Klass *klass); + + template<class OopClosureType> + static typename enable_if<is_kind_of<ExtendedOopClosure, OopClosureType>::value, void>::type + do_class_loader_data(OopClosureType *cl, ClassLoaderData* cld); + }; class SpecializationStats { public: enum Kind { ik, // InstanceKlass
< prev index next >