55 // In support of post-processing of weak links of KlassKlass objects; |
56 // In support of post-processing of weak links of KlassKlass objects; |
56 // see KlassKlass::oop_oop_iterate(). |
57 // see KlassKlass::oop_oop_iterate(). |
57 virtual const bool should_remember_klasses() const { return false; } |
58 virtual const bool should_remember_klasses() const { return false; } |
58 virtual void remember_klass(Klass* k) { /* do nothing */ } |
59 virtual void remember_klass(Klass* k) { /* do nothing */ } |
59 |
60 |
60 // If "true", invoke on nmethods (when scanning compiled frames). |
|
61 virtual const bool do_nmethods() const { return false; } |
|
62 |
|
63 // The methods below control how object iterations invoking this closure |
61 // The methods below control how object iterations invoking this closure |
64 // should be performed: |
62 // should be performed: |
65 |
63 |
66 // If "true", invoke on header klass field. |
64 // If "true", invoke on header klass field. |
67 bool do_header() { return true; } // Note that this is non-virtual. |
65 bool do_header() { return true; } // Note that this is non-virtual. |
153 |
151 |
154 class CompactibleSpaceClosure : public StackObj { |
152 class CompactibleSpaceClosure : public StackObj { |
155 public: |
153 public: |
156 // Called for each compactible space |
154 // Called for each compactible space |
157 virtual void do_space(CompactibleSpace* s) = 0; |
155 virtual void do_space(CompactibleSpace* s) = 0; |
|
156 }; |
|
157 |
|
158 |
|
159 // CodeBlobClosure is used for iterating through code blobs |
|
160 // in the code cache or on thread stacks |
|
161 |
|
162 class CodeBlobClosure : public Closure { |
|
163 public: |
|
164 // Called for each code blob. |
|
165 virtual void do_code_blob(CodeBlob* cb) = 0; |
|
166 }; |
|
167 |
|
168 |
|
169 class MarkingCodeBlobClosure : public CodeBlobClosure { |
|
170 public: |
|
171 // Called for each code blob, but at most once per unique blob. |
|
172 virtual void do_newly_marked_nmethod(CodeBlob* cb) = 0; |
|
173 |
|
174 virtual void do_code_blob(CodeBlob* cb); |
|
175 // = { if (!nmethod(cb)->test_set_oops_do_mark()) do_newly_marked_nmethod(cb); } |
|
176 |
|
177 class MarkScope : public StackObj { |
|
178 protected: |
|
179 bool _active; |
|
180 public: |
|
181 MarkScope(bool activate = true); |
|
182 // = { if (active) nmethod::oops_do_marking_prologue(); } |
|
183 ~MarkScope(); |
|
184 // = { if (active) nmethod::oops_do_marking_epilogue(); } |
|
185 }; |
|
186 }; |
|
187 |
|
188 |
|
189 // Applies an oop closure to all ref fields in code blobs |
|
190 // iterated over in an object iteration. |
|
191 class CodeBlobToOopClosure: public MarkingCodeBlobClosure { |
|
192 OopClosure* _cl; |
|
193 bool _do_marking; |
|
194 public: |
|
195 virtual void do_newly_marked_nmethod(CodeBlob* cb); |
|
196 // = { cb->oops_do(_cl); } |
|
197 virtual void do_code_blob(CodeBlob* cb); |
|
198 // = { if (_do_marking) super::do_code_blob(cb); else cb->oops_do(_cl); } |
|
199 CodeBlobToOopClosure(OopClosure* cl, bool do_marking) |
|
200 : _cl(cl), _do_marking(do_marking) {} |
158 }; |
201 }; |
159 |
202 |
160 |
203 |
161 |
204 |
162 // MonitorClosure is used for iterating over monitors in the monitors cache |
205 // MonitorClosure is used for iterating over monitors in the monitors cache |