132 public: |
132 public: |
133 virtual void do_cld(ClassLoaderData* cld) = 0; |
133 virtual void do_cld(ClassLoaderData* cld) = 0; |
134 }; |
134 }; |
135 |
135 |
136 class KlassToOopClosure : public KlassClosure { |
136 class KlassToOopClosure : public KlassClosure { |
|
137 friend class MetadataAwareOopClosure; |
|
138 friend class MetadataAwareOopsInGenClosure; |
|
139 |
137 OopClosure* _oop_closure; |
140 OopClosure* _oop_closure; |
138 public: |
141 |
139 KlassToOopClosure(OopClosure* oop_closure) : _oop_closure(oop_closure) {} |
142 // Used when _oop_closure couldn't be set in an initialization list. |
|
143 void initialize(OopClosure* oop_closure) { |
|
144 assert(_oop_closure == NULL, "Should only be called once"); |
|
145 _oop_closure = oop_closure; |
|
146 } |
|
147 |
|
148 public: |
|
149 KlassToOopClosure(OopClosure* oop_closure = NULL) : _oop_closure(oop_closure) {} |
140 virtual void do_klass(Klass* k); |
150 virtual void do_klass(Klass* k); |
141 }; |
151 }; |
142 |
152 |
143 class CLDToOopClosure : public CLDClosure { |
153 class CLDToOopClosure : public CLDClosure { |
144 OopClosure* _oop_closure; |
154 OopClosure* _oop_closure; |
150 _oop_closure(oop_closure), |
160 _oop_closure(oop_closure), |
151 _klass_closure(oop_closure), |
161 _klass_closure(oop_closure), |
152 _must_claim_cld(must_claim_cld) {} |
162 _must_claim_cld(must_claim_cld) {} |
153 |
163 |
154 void do_cld(ClassLoaderData* cld); |
164 void do_cld(ClassLoaderData* cld); |
|
165 }; |
|
166 |
|
167 // The base class for all concurrent marking closures, |
|
168 // that participates in class unloading. |
|
169 // It's used to proxy through the metadata to the oops defined in them. |
|
170 class MetadataAwareOopClosure: public ExtendedOopClosure { |
|
171 KlassToOopClosure _klass_closure; |
|
172 |
|
173 public: |
|
174 MetadataAwareOopClosure() : ExtendedOopClosure() { |
|
175 _klass_closure.initialize(this); |
|
176 } |
|
177 MetadataAwareOopClosure(ReferenceProcessor* rp) : ExtendedOopClosure(rp) { |
|
178 _klass_closure.initialize(this); |
|
179 } |
|
180 |
|
181 virtual bool do_metadata() { return do_metadata_nv(); } |
|
182 inline bool do_metadata_nv() { return true; } |
|
183 |
|
184 virtual void do_klass(Klass* k); |
|
185 void do_klass_nv(Klass* k); |
|
186 |
|
187 virtual void do_class_loader_data(ClassLoaderData* cld); |
155 }; |
188 }; |
156 |
189 |
157 // ObjectClosure is used for iterating through an object space |
190 // ObjectClosure is used for iterating through an object space |
158 |
191 |
159 class ObjectClosure : public Closure { |
192 class ObjectClosure : public Closure { |
335 static void store_symbol(Symbol** p, Symbol* sym) { |
368 static void store_symbol(Symbol** p, Symbol* sym) { |
336 *p = (Symbol*)(intptr_t(sym) | (intptr_t(*p) & 1)); |
369 *p = (Symbol*)(intptr_t(sym) | (intptr_t(*p) & 1)); |
337 } |
370 } |
338 }; |
371 }; |
339 |
372 |
|
373 |
|
374 // Helper defines for ExtendOopClosure |
|
375 |
|
376 #define if_do_metadata_checked(closure, nv_suffix) \ |
|
377 /* Make sure the non-virtual and the virtual versions match. */ \ |
|
378 assert(closure->do_metadata##nv_suffix() == closure->do_metadata(), \ |
|
379 "Inconsistency in do_metadata"); \ |
|
380 if (closure->do_metadata##nv_suffix()) |
|
381 |
|
382 #define assert_should_ignore_metadata(closure, nv_suffix) \ |
|
383 assert(!closure->do_metadata##nv_suffix(), "Code to handle metadata is not implemented") |
|
384 |
340 #endif // SHARE_VM_MEMORY_ITERATOR_HPP |
385 #endif // SHARE_VM_MEMORY_ITERATOR_HPP |