136 class CLDClosure : public Closure { |
136 class CLDClosure : public Closure { |
137 public: |
137 public: |
138 virtual void do_cld(ClassLoaderData* cld) = 0; |
138 virtual void do_cld(ClassLoaderData* cld) = 0; |
139 }; |
139 }; |
140 |
140 |
141 class KlassToOopClosure : public KlassClosure { |
|
142 friend class MetadataAwareOopClosure; |
|
143 friend class MetadataAwareOopsInGenClosure; |
|
144 |
|
145 OopClosure* _oop_closure; |
|
146 |
|
147 // Used when _oop_closure couldn't be set in an initialization list. |
|
148 void initialize(OopClosure* oop_closure) { |
|
149 assert(_oop_closure == NULL, "Should only be called once"); |
|
150 _oop_closure = oop_closure; |
|
151 } |
|
152 |
|
153 public: |
|
154 KlassToOopClosure(OopClosure* oop_closure = NULL) : _oop_closure(oop_closure) {} |
|
155 |
|
156 virtual void do_klass(Klass* k); |
|
157 }; |
|
158 |
141 |
159 class CLDToOopClosure : public CLDClosure { |
142 class CLDToOopClosure : public CLDClosure { |
160 OopClosure* _oop_closure; |
143 OopClosure* _oop_closure; |
161 KlassToOopClosure _klass_closure; |
|
162 bool _must_claim_cld; |
144 bool _must_claim_cld; |
163 |
145 |
164 public: |
146 public: |
165 CLDToOopClosure(OopClosure* oop_closure, bool must_claim_cld = true) : |
147 CLDToOopClosure(OopClosure* oop_closure, bool must_claim_cld = true) : |
166 _oop_closure(oop_closure), |
148 _oop_closure(oop_closure), |
167 _klass_closure(oop_closure), |
|
168 _must_claim_cld(must_claim_cld) {} |
149 _must_claim_cld(must_claim_cld) {} |
169 |
150 |
170 void do_cld(ClassLoaderData* cld); |
|
171 }; |
|
172 |
|
173 class CLDToKlassAndOopClosure : public CLDClosure { |
|
174 friend class G1CollectedHeap; |
|
175 protected: |
|
176 OopClosure* _oop_closure; |
|
177 KlassClosure* _klass_closure; |
|
178 bool _must_claim_cld; |
|
179 public: |
|
180 CLDToKlassAndOopClosure(KlassClosure* klass_closure, |
|
181 OopClosure* oop_closure, |
|
182 bool must_claim_cld) : |
|
183 _oop_closure(oop_closure), |
|
184 _klass_closure(klass_closure), |
|
185 _must_claim_cld(must_claim_cld) {} |
|
186 void do_cld(ClassLoaderData* cld); |
151 void do_cld(ClassLoaderData* cld); |
187 }; |
152 }; |
188 |
153 |
189 // The base class for all concurrent marking closures, |
154 // The base class for all concurrent marking closures, |
190 // that participates in class unloading. |
155 // that participates in class unloading. |
191 // It's used to proxy through the metadata to the oops defined in them. |
156 // It's used to proxy through the metadata to the oops defined in them. |
192 class MetadataAwareOopClosure: public ExtendedOopClosure { |
157 class MetadataAwareOopClosure: public ExtendedOopClosure { |
193 KlassToOopClosure _klass_closure; |
158 |
194 |
159 public: |
195 public: |
160 MetadataAwareOopClosure() : ExtendedOopClosure() { } |
196 MetadataAwareOopClosure() : ExtendedOopClosure() { |
161 MetadataAwareOopClosure(ReferenceProcessor* rp) : ExtendedOopClosure(rp) { } |
197 _klass_closure.initialize(this); |
|
198 } |
|
199 MetadataAwareOopClosure(ReferenceProcessor* rp) : ExtendedOopClosure(rp) { |
|
200 _klass_closure.initialize(this); |
|
201 } |
|
202 |
162 |
203 bool do_metadata_nv() { return true; } |
163 bool do_metadata_nv() { return true; } |
204 virtual bool do_metadata() { return do_metadata_nv(); } |
164 virtual bool do_metadata() { return do_metadata_nv(); } |
205 |
165 |
206 void do_klass_nv(Klass* k); |
166 void do_klass_nv(Klass* k); |