202 assert(k != NULL, "invariant"); |
202 assert(k != NULL, "invariant"); |
203 KlassPtr klass = (KlassPtr)k; |
203 KlassPtr klass = (KlassPtr)k; |
204 return write_klass(writer, klass, true); |
204 return write_klass(writer, klass, true); |
205 } |
205 } |
206 |
206 |
|
207 static bool is_implied(const Klass* klass) { |
|
208 assert(klass != NULL, "invariant"); |
|
209 return klass->is_subclass_of(SystemDictionary::ClassLoader_klass()) || klass == SystemDictionary::Object_klass(); |
|
210 } |
|
211 |
207 static void do_implied(Klass* klass) { |
212 static void do_implied(Klass* klass) { |
208 assert(klass != NULL, "invariant"); |
213 assert(klass != NULL, "invariant"); |
209 if (klass->is_subclass_of(SystemDictionary::ClassLoader_klass()) || klass == SystemDictionary::Object_klass()) { |
214 if (is_implied(klass)) { |
210 if (_leakp_writer != NULL) { |
215 if (_leakp_writer != NULL) { |
211 SET_LEAKP(klass); |
216 SET_LEAKP(klass); |
212 } |
217 } |
213 _subsystem_callback->do_artifact(klass); |
218 _subsystem_callback->do_artifact(klass); |
214 } |
219 } |
256 typedef SerializePredicate<KlassPtr> KlassPredicate; |
261 typedef SerializePredicate<KlassPtr> KlassPredicate; |
257 typedef JfrPredicatedTypeWriterImplHost<KlassPtr, KlassPredicate, write__klass> KlassWriterImpl; |
262 typedef JfrPredicatedTypeWriterImplHost<KlassPtr, KlassPredicate, write__klass> KlassWriterImpl; |
258 typedef JfrTypeWriterHost<KlassWriterImpl, TYPE_CLASS> KlassWriter; |
263 typedef JfrTypeWriterHost<KlassWriterImpl, TYPE_CLASS> KlassWriter; |
259 typedef CompositeFunctor<KlassPtr, KlassWriter, KlassArtifactRegistrator> KlassWriterRegistration; |
264 typedef CompositeFunctor<KlassPtr, KlassWriter, KlassArtifactRegistrator> KlassWriterRegistration; |
260 typedef JfrArtifactCallbackHost<KlassPtr, KlassWriterRegistration> KlassCallback; |
265 typedef JfrArtifactCallbackHost<KlassPtr, KlassWriterRegistration> KlassCallback; |
|
266 |
|
267 template <> |
|
268 class LeakPredicate<const Klass*> { |
|
269 public: |
|
270 LeakPredicate(bool class_unload) {} |
|
271 bool operator()(const Klass* klass) { |
|
272 assert(klass != NULL, "invariant"); |
|
273 return IS_LEAKP(klass) || is_implied(klass); |
|
274 } |
|
275 }; |
261 |
276 |
262 typedef LeakPredicate<KlassPtr> LeakKlassPredicate; |
277 typedef LeakPredicate<KlassPtr> LeakKlassPredicate; |
263 typedef JfrPredicatedTypeWriterImplHost<KlassPtr, LeakKlassPredicate, write__klass__leakp> LeakKlassWriterImpl; |
278 typedef JfrPredicatedTypeWriterImplHost<KlassPtr, LeakKlassPredicate, write__klass__leakp> LeakKlassWriterImpl; |
264 typedef JfrTypeWriterHost<LeakKlassWriterImpl, TYPE_CLASS> LeakKlassWriter; |
279 typedef JfrTypeWriterHost<LeakKlassWriterImpl, TYPE_CLASS> LeakKlassWriter; |
265 |
280 |