< 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 >