Mercurial > hg > graal-compiler
comparison src/share/vm/memory/iterator.hpp @ 20268:4c1b88a53c74
8046670: Make CMS metadata aware closures applicable for other collectors
Reviewed-by: ehelin, mgerdin
author | stefank |
---|---|
date | Tue, 24 Jun 2014 16:20:15 +0200 |
parents | 5255b195f828 |
children | 2c6ef90f030a |
comparison
equal
deleted
inserted
replaced
20267:ff1e37e7eb83 | 20268:4c1b88a53c74 |
---|---|
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 |