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