< prev index next >

src/share/vm/memory/iterator.hpp

Print this page
rev 7183 : autospecialized oop_iterate using SFINAE and templates

*** 45,54 **** --- 45,59 ---- public: virtual void do_oop(oop* o) = 0; virtual void do_oop_v(oop* o) { do_oop(o); } virtual void do_oop(narrowOop* o) = 0; virtual void do_oop_v(narrowOop* o) { do_oop(o); } + + // Use SFINAE to dispatch to the "most appropriate" do_oop using OopClosureDispatcher. + // Read the specialized_oop_closures.hpp file how this works + template<class OopClosureType, class OopType> + void do_oop_auto(OopType* o); }; // ExtendedOopClosure adds extra code to be run during oop iterations. // This is needed by the GC and is extracted to a separate type to not // pollute the OopClosure interface.
*** 74,96 **** --- 79,125 ---- // Currently, only CMS and G1 need these. virtual bool do_metadata() { return do_metadata_nv(); } bool do_metadata_v() { return do_metadata(); } bool do_metadata_nv() { return false; } + // Use SFINAE to dispatch to the "most appropriate" do_metadata using OopClosureDispatcher. + // Read the specialized_oop_closures.hpp file how this works + template<class OopClosureType> + bool do_metadata_auto(); virtual void do_klass(Klass* k) { do_klass_nv(k); } void do_klass_v(Klass* k) { do_klass(k); } void do_klass_nv(Klass* k) { ShouldNotReachHere(); } + // Use SFINAE to dispatch to the "most appropriate" do_klass using OopClosureDispatcher. + // Read the specialized_oop_closures.hpp file how this works + template<class OopClosureType> + void do_klass_auto(Klass* klass); virtual void do_class_loader_data(ClassLoaderData* cld) { ShouldNotReachHere(); } + // Use SFINAE to dispatch to the "most appropriate" do_class_loader_data using OopClosureDispatcher. + // Read the specialized_oop_closures.hpp file how this works + template<class OopClosureType> + void do_class_loader_data_auto(ClassLoaderData* cld); // True iff this closure may be safely applied more than once to an oop // location without an intervening "major reset" (like the end of a GC). virtual bool idempotent() { return false; } virtual bool apply_to_weak_ref_discovered_field() { return false; } }; + // Autospecialization uses an OopClosure rather than ExtendedOopClosure + // for oop_iterate_no_header to make sure metadata methods are not called + // in the first place using SFINAE type checks + template<class OopClosureType> + class NoHeaderOopClosure : public OopClosure { + OopClosureType* _cl; + public: + NoHeaderOopClosure(OopClosureType *cl) : _cl(cl) {} + void do_oop(oop *p) { _cl->template do_oop_auto<OopClosureType, oop>(p); } + void do_oop(narrowOop *p) { _cl->template do_oop_auto<OopClosureType, narrowOop>(p); } + }; + // Wrapper closure only used to implement oop_iterate_no_header(). class NoHeaderExtendedOopClosure : public ExtendedOopClosure { OopClosure* _wrapped_closure; public: NoHeaderExtendedOopClosure(OopClosure* cl) : _wrapped_closure(cl) {}
< prev index next >