29 #include "memory/memRegion.hpp" 30 #include "oops/oopsHierarchy.hpp" 31 32 class CodeBlob; 33 class nmethod; 34 class ReferenceProcessor; 35 class DataLayout; 36 class KlassClosure; 37 class ClassLoaderData; 38 class Symbol; 39 40 // The following classes are C++ `closures` for iterating over objects, roots and spaces 41 42 class Closure : public StackObj { }; 43 44 // OopClosure is used for iterating through references to Java objects. 45 class OopClosure : public Closure { 46 public: 47 virtual void do_oop(oop* o) = 0; 48 virtual void do_oop(narrowOop* o) = 0; 49 }; 50 51 // ExtendedOopClosure adds extra code to be run during oop iterations. 52 // This is needed by the GC and is extracted to a separate type to not 53 // pollute the OopClosure interface. 54 class ExtendedOopClosure : public OopClosure { 55 private: 56 ReferenceProcessor* _ref_processor; 57 58 protected: 59 ExtendedOopClosure(ReferenceProcessor* rp) : _ref_processor(rp) { } 60 ExtendedOopClosure() : _ref_processor(NULL) { } 61 ~ExtendedOopClosure() { } 62 63 void set_ref_processor_internal(ReferenceProcessor* rp) { _ref_processor = rp; } 64 65 public: 66 ReferenceProcessor* ref_processor() const { return _ref_processor; } 67 68 // Iteration of InstanceRefKlasses differ depending on the closure, | 29 #include "memory/memRegion.hpp" 30 #include "oops/oopsHierarchy.hpp" 31 32 class CodeBlob; 33 class nmethod; 34 class ReferenceProcessor; 35 class DataLayout; 36 class KlassClosure; 37 class ClassLoaderData; 38 class Symbol; 39 40 // The following classes are C++ `closures` for iterating over objects, roots and spaces 41 42 class Closure : public StackObj { }; 43 44 // OopClosure is used for iterating through references to Java objects. 45 class OopClosure : public Closure { 46 public: 47 virtual void do_oop(oop* o) = 0; 48 virtual void do_oop(narrowOop* o) = 0; 49 virtual void do_oop_no_buffering(oop* o) { do_oop(o); } 50 virtual void do_oop_no_buffering(narrowOop* o) { do_oop(o); } 51 }; 52 53 // ExtendedOopClosure adds extra code to be run during oop iterations. 54 // This is needed by the GC and is extracted to a separate type to not 55 // pollute the OopClosure interface. 56 class ExtendedOopClosure : public OopClosure { 57 private: 58 ReferenceProcessor* _ref_processor; 59 60 protected: 61 ExtendedOopClosure(ReferenceProcessor* rp) : _ref_processor(rp) { } 62 ExtendedOopClosure() : _ref_processor(NULL) { } 63 ~ExtendedOopClosure() { } 64 65 void set_ref_processor_internal(ReferenceProcessor* rp) { _ref_processor = rp; } 66 67 public: 68 ReferenceProcessor* ref_processor() const { return _ref_processor; } 69 70 // Iteration of InstanceRefKlasses differ depending on the closure, |