37 class ClassLoaderData;
38 class Symbol;
39 class Metadata;
40 class Thread;
41
42 // The following classes are C++ `closures` for iterating over objects, roots and spaces
43
44 class Closure : public StackObj { };
45
46 // Thread iterator
47 class ThreadClosure {
48 public:
49 virtual void do_thread(Thread* thread) = 0;
50 };
51
52 // OopClosure is used for iterating through references to Java objects.
53 class OopClosure : public Closure {
54 public:
55 virtual void do_oop(oop* o) = 0;
56 virtual void do_oop(narrowOop* o) = 0;
57 };
58
59 class DoNothingClosure : public OopClosure {
60 public:
61 virtual void do_oop(oop* p) {}
62 virtual void do_oop(narrowOop* p) {}
63 };
64 extern DoNothingClosure do_nothing_cl;
65
66 // OopIterateClosure adds extra code to be run during oop iterations.
67 // This is needed by the GC and is extracted to a separate type to not
68 // pollute the OopClosure interface.
69 class OopIterateClosure : public OopClosure {
70 private:
71 ReferenceDiscoverer* _ref_discoverer;
72
73 protected:
74 OopIterateClosure(ReferenceDiscoverer* rd) : _ref_discoverer(rd) { }
75 OopIterateClosure() : _ref_discoverer(nullptr) { }
76 ~OopIterateClosure() { }
120 virtual void do_klass(Klass* k) { ShouldNotReachHere(); }
121 virtual void do_cld(ClassLoaderData* cld) { ShouldNotReachHere(); }
122 virtual void do_method(Method* m) { ShouldNotReachHere(); }
123 virtual void do_nmethod(nmethod* nm) { ShouldNotReachHere(); }
124 };
125
126 // Interface for applying an OopClosure to a set of oops.
127 class OopIterator {
128 public:
129 virtual void oops_do(OopClosure* cl) = 0;
130 };
131
132 enum class derived_base : intptr_t;
133 enum class derived_pointer : intptr_t;
134 class DerivedOopClosure : public Closure {
135 public:
136 enum { SkipNull = true };
137 virtual void do_derived_oop(derived_base* base, derived_pointer* derived) = 0;
138 };
139
140 class KlassClosure : public Closure {
141 public:
142 virtual void do_klass(Klass* k) = 0;
143 };
144
145 class CLDClosure : public Closure {
146 public:
147 virtual void do_cld(ClassLoaderData* cld) = 0;
148 };
149
150 class MetadataClosure : public Closure {
151 public:
152 virtual void do_metadata(Metadata* md) = 0;
153 };
154
155
156 class CLDToOopClosure : public CLDClosure {
157 OopClosure* _oop_closure;
158 int _cld_claim;
159
|
37 class ClassLoaderData;
38 class Symbol;
39 class Metadata;
40 class Thread;
41
42 // The following classes are C++ `closures` for iterating over objects, roots and spaces
43
44 class Closure : public StackObj { };
45
46 // Thread iterator
47 class ThreadClosure {
48 public:
49 virtual void do_thread(Thread* thread) = 0;
50 };
51
52 // OopClosure is used for iterating through references to Java objects.
53 class OopClosure : public Closure {
54 public:
55 virtual void do_oop(oop* o) = 0;
56 virtual void do_oop(narrowOop* o) = 0;
57 virtual void do_oop_no_buffering(oop* o) { do_oop(o); }
58 virtual void do_oop_no_buffering(narrowOop* o) { do_oop(o); }
59 };
60
61 class DoNothingClosure : public OopClosure {
62 public:
63 virtual void do_oop(oop* p) {}
64 virtual void do_oop(narrowOop* p) {}
65 };
66 extern DoNothingClosure do_nothing_cl;
67
68 // OopIterateClosure adds extra code to be run during oop iterations.
69 // This is needed by the GC and is extracted to a separate type to not
70 // pollute the OopClosure interface.
71 class OopIterateClosure : public OopClosure {
72 private:
73 ReferenceDiscoverer* _ref_discoverer;
74
75 protected:
76 OopIterateClosure(ReferenceDiscoverer* rd) : _ref_discoverer(rd) { }
77 OopIterateClosure() : _ref_discoverer(nullptr) { }
78 ~OopIterateClosure() { }
122 virtual void do_klass(Klass* k) { ShouldNotReachHere(); }
123 virtual void do_cld(ClassLoaderData* cld) { ShouldNotReachHere(); }
124 virtual void do_method(Method* m) { ShouldNotReachHere(); }
125 virtual void do_nmethod(nmethod* nm) { ShouldNotReachHere(); }
126 };
127
128 // Interface for applying an OopClosure to a set of oops.
129 class OopIterator {
130 public:
131 virtual void oops_do(OopClosure* cl) = 0;
132 };
133
134 enum class derived_base : intptr_t;
135 enum class derived_pointer : intptr_t;
136 class DerivedOopClosure : public Closure {
137 public:
138 enum { SkipNull = true };
139 virtual void do_derived_oop(derived_base* base, derived_pointer* derived) = 0;
140 };
141
142 class BufferedValueClosure : public Closure {
143 public:
144 virtual void do_buffered_value(oop* p) = 0;
145 };
146
147 class KlassClosure : public Closure {
148 public:
149 virtual void do_klass(Klass* k) = 0;
150 };
151
152 class CLDClosure : public Closure {
153 public:
154 virtual void do_cld(ClassLoaderData* cld) = 0;
155 };
156
157 class MetadataClosure : public Closure {
158 public:
159 virtual void do_metadata(Metadata* md) = 0;
160 };
161
162
163 class CLDToOopClosure : public CLDClosure {
164 OopClosure* _oop_closure;
165 int _cld_claim;
166
|