< prev index next >
src/share/vm/memory/specialized_oop_closures.hpp
Print this page
rev 7183 : autospecialized oop_iterate using SFINAE and templates
@@ -24,10 +24,11 @@
#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,10 +68,29 @@
// 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,10 +212,124 @@
SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES(f)
// For keeping stats on effectiveness.
#define ENABLE_SPECIALIZATION_STATS 0
+enum DispatchTag {
+ _unknown_klass = 1,
+ _instance_mirror_klass,
+ _instance_class_loader_klass,
+ _instance_ref_klass,
+};
+
+/**
+ * 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 >