113 public: |
113 public: |
114 virtual void do_cld(ClassLoaderData* cld) = 0; |
114 virtual void do_cld(ClassLoaderData* cld) = 0; |
115 }; |
115 }; |
116 |
116 |
117 class KlassToOopClosure : public KlassClosure { |
117 class KlassToOopClosure : public KlassClosure { |
|
118 friend class MetadataAwareOopClosure; |
|
119 friend class MetadataAwareOopsInGenClosure; |
|
120 |
118 OopClosure* _oop_closure; |
121 OopClosure* _oop_closure; |
119 public: |
122 |
120 KlassToOopClosure(OopClosure* oop_closure) : _oop_closure(oop_closure) {} |
123 // Used when _oop_closure couldn't be set in an initialization list. |
|
124 void initialize(OopClosure* oop_closure) { |
|
125 assert(_oop_closure == NULL, "Should only be called once"); |
|
126 _oop_closure = oop_closure; |
|
127 } |
|
128 |
|
129 public: |
|
130 KlassToOopClosure(OopClosure* oop_closure = NULL) : _oop_closure(oop_closure) {} |
121 virtual void do_klass(Klass* k); |
131 virtual void do_klass(Klass* k); |
122 }; |
132 }; |
123 |
133 |
124 class CLDToOopClosure : public CLDClosure { |
134 class CLDToOopClosure : public CLDClosure { |
125 OopClosure* _oop_closure; |
135 OopClosure* _oop_closure; |
131 _oop_closure(oop_closure), |
141 _oop_closure(oop_closure), |
132 _klass_closure(oop_closure), |
142 _klass_closure(oop_closure), |
133 _must_claim_cld(must_claim_cld) {} |
143 _must_claim_cld(must_claim_cld) {} |
134 |
144 |
135 void do_cld(ClassLoaderData* cld); |
145 void do_cld(ClassLoaderData* cld); |
|
146 }; |
|
147 |
|
148 // The base class for all concurrent marking closures, |
|
149 // that participates in class unloading. |
|
150 // It's used to proxy through the metadata to the oops defined in them. |
|
151 class MetadataAwareOopClosure: public ExtendedOopClosure { |
|
152 KlassToOopClosure _klass_closure; |
|
153 |
|
154 public: |
|
155 MetadataAwareOopClosure() : ExtendedOopClosure() { |
|
156 _klass_closure.initialize(this); |
|
157 } |
|
158 MetadataAwareOopClosure(ReferenceProcessor* rp) : ExtendedOopClosure(rp) { |
|
159 _klass_closure.initialize(this); |
|
160 } |
|
161 |
|
162 virtual bool do_metadata() { return do_metadata_nv(); } |
|
163 inline bool do_metadata_nv() { return true; } |
|
164 |
|
165 virtual void do_klass(Klass* k); |
|
166 void do_klass_nv(Klass* k); |
|
167 |
|
168 virtual void do_class_loader_data(ClassLoaderData* cld); |
136 }; |
169 }; |
137 |
170 |
138 // ObjectClosure is used for iterating through an object space |
171 // ObjectClosure is used for iterating through an object space |
139 |
172 |
140 class ObjectClosure : public Closure { |
173 class ObjectClosure : public Closure { |
316 static void store_symbol(Symbol** p, Symbol* sym) { |
349 static void store_symbol(Symbol** p, Symbol* sym) { |
317 *p = (Symbol*)(intptr_t(sym) | (intptr_t(*p) & 1)); |
350 *p = (Symbol*)(intptr_t(sym) | (intptr_t(*p) & 1)); |
318 } |
351 } |
319 }; |
352 }; |
320 |
353 |
|
354 |
|
355 // Helper defines for ExtendOopClosure |
|
356 |
|
357 #define if_do_metadata_checked(closure, nv_suffix) \ |
|
358 /* Make sure the non-virtual and the virtual versions match. */ \ |
|
359 assert(closure->do_metadata##nv_suffix() == closure->do_metadata(), \ |
|
360 "Inconsistency in do_metadata"); \ |
|
361 if (closure->do_metadata##nv_suffix()) |
|
362 |
|
363 #define assert_should_ignore_metadata(closure, nv_suffix) \ |
|
364 assert(!closure->do_metadata##nv_suffix(), "Code to handle metadata is not implemented") |
|
365 |
321 #endif // SHARE_VM_MEMORY_ITERATOR_HPP |
366 #endif // SHARE_VM_MEMORY_ITERATOR_HPP |