75 return pkg_entry == NULL ? 0 : TRACE_ID(pkg_entry); |
75 return pkg_entry == NULL ? 0 : TRACE_ID(pkg_entry); |
76 } |
76 } |
77 |
77 |
78 static traceid cld_id(CldPtr cld) { |
78 static traceid cld_id(CldPtr cld) { |
79 assert(cld != NULL, "invariant"); |
79 assert(cld != NULL, "invariant"); |
80 return cld->is_anonymous() ? 0 : TRACE_ID(cld); |
80 return cld->is_unsafe_anonymous() ? 0 : TRACE_ID(cld); |
81 } |
81 } |
82 |
82 |
83 static void tag_leakp_klass_artifacts(KlassPtr k, bool class_unload) { |
83 static void tag_leakp_klass_artifacts(KlassPtr k, bool class_unload) { |
84 assert(k != NULL, "invariant"); |
84 assert(k != NULL, "invariant"); |
85 PkgPtr pkg = k->package(); |
85 PkgPtr pkg = k->package(); |
90 tag_leakp_artifact(module, class_unload); |
90 tag_leakp_artifact(module, class_unload); |
91 } |
91 } |
92 } |
92 } |
93 CldPtr cld = k->class_loader_data(); |
93 CldPtr cld = k->class_loader_data(); |
94 assert(cld != NULL, "invariant"); |
94 assert(cld != NULL, "invariant"); |
95 if (!cld->is_anonymous()) { |
95 if (!cld->is_unsafe_anonymous()) { |
96 tag_leakp_artifact(cld, class_unload); |
96 tag_leakp_artifact(cld, class_unload); |
97 } |
97 } |
98 } |
98 } |
99 |
99 |
100 class TagLeakpKlassArtifact { |
100 class TagLeakpKlassArtifact { |
228 typedef JfrArtifactWriterHost<ModuleWriterImpl, TYPE_MODULE> ModuleWriter; |
228 typedef JfrArtifactWriterHost<ModuleWriterImpl, TYPE_MODULE> ModuleWriter; |
229 |
229 |
230 int write__artifact__classloader(JfrCheckpointWriter* writer, JfrArtifactSet* artifacts, const void* c) { |
230 int write__artifact__classloader(JfrCheckpointWriter* writer, JfrArtifactSet* artifacts, const void* c) { |
231 assert(c != NULL, "invariant"); |
231 assert(c != NULL, "invariant"); |
232 CldPtr cld = (CldPtr)c; |
232 CldPtr cld = (CldPtr)c; |
233 assert(!cld->is_anonymous(), "invariant"); |
233 assert(!cld->is_unsafe_anonymous(), "invariant"); |
234 const traceid cld_id = TRACE_ID(cld); |
234 const traceid cld_id = TRACE_ID(cld); |
235 // class loader type |
235 // class loader type |
236 const Klass* class_loader_klass = cld->class_loader_klass(); |
236 const Klass* class_loader_klass = cld->class_loader_klass(); |
237 if (class_loader_klass == NULL) { |
237 if (class_loader_klass == NULL) { |
238 // (primordial) boot class loader |
238 // (primordial) boot class loader |
299 int write__artifact__klass__symbol(JfrCheckpointWriter* writer, JfrArtifactSet* artifacts, const void* k) { |
299 int write__artifact__klass__symbol(JfrCheckpointWriter* writer, JfrArtifactSet* artifacts, const void* k) { |
300 assert(writer != NULL, "invariant"); |
300 assert(writer != NULL, "invariant"); |
301 assert(artifacts != NULL, "invaiant"); |
301 assert(artifacts != NULL, "invaiant"); |
302 assert(k != NULL, "invariant"); |
302 assert(k != NULL, "invariant"); |
303 const InstanceKlass* const ik = (const InstanceKlass*)k; |
303 const InstanceKlass* const ik = (const InstanceKlass*)k; |
304 if (ik->is_anonymous()) { |
304 if (ik->is_unsafe_anonymous()) { |
305 CStringEntryPtr entry = |
305 CStringEntryPtr entry = |
306 artifacts->map_cstring(JfrSymbolId::anonymous_klass_name_hash_code(ik)); |
306 artifacts->map_cstring(JfrSymbolId::unsafe_anonymous_klass_name_hash_code(ik)); |
307 assert(entry != NULL, "invariant"); |
307 assert(entry != NULL, "invariant"); |
308 return write__artifact__cstring__entry__(writer, entry); |
308 return write__artifact__cstring__entry__(writer, entry); |
309 } |
309 } |
310 |
310 |
311 SymbolEntryPtr entry = artifacts->map_symbol(JfrSymbolId::regular_klass_name_hash_code(ik)); |
311 SymbolEntryPtr entry = artifacts->map_symbol(JfrSymbolId::regular_klass_name_hash_code(ik)); |
356 count += module_symbols(module); |
356 count += module_symbols(module); |
357 } |
357 } |
358 } |
358 } |
359 CldPtr cld = klass->class_loader_data(); |
359 CldPtr cld = klass->class_loader_data(); |
360 assert(cld != NULL, "invariant"); |
360 assert(cld != NULL, "invariant"); |
361 if (!cld->is_anonymous()) { |
361 if (!cld->is_unsafe_anonymous()) { |
362 count += class_loader_symbols(cld); |
362 count += class_loader_symbols(cld); |
363 } |
363 } |
364 if (_method_used_predicate(klass)) { |
364 if (_method_used_predicate(klass)) { |
365 count += method_symbols(klass); |
365 count += method_symbols(klass); |
366 } |
366 } |
372 template <template <typename> class Predicate> |
372 template <template <typename> class Predicate> |
373 int KlassSymbolWriterImpl<Predicate>::klass_symbols(KlassPtr klass) { |
373 int KlassSymbolWriterImpl<Predicate>::klass_symbols(KlassPtr klass) { |
374 assert(klass != NULL, "invariant"); |
374 assert(klass != NULL, "invariant"); |
375 assert(_predicate(klass), "invariant"); |
375 assert(_predicate(klass), "invariant"); |
376 const InstanceKlass* const ik = (const InstanceKlass*)klass; |
376 const InstanceKlass* const ik = (const InstanceKlass*)klass; |
377 if (ik->is_anonymous()) { |
377 if (ik->is_unsafe_anonymous()) { |
378 CStringEntryPtr entry = |
378 CStringEntryPtr entry = |
379 this->_artifacts->map_cstring(JfrSymbolId::anonymous_klass_name_hash_code(ik)); |
379 this->_artifacts->map_cstring(JfrSymbolId::unsafe_anonymous_klass_name_hash_code(ik)); |
380 assert(entry != NULL, "invariant"); |
380 assert(entry != NULL, "invariant"); |
381 return _unique_predicate(entry->id()) ? write__artifact__cstring__entry__(this->_writer, entry) : 0; |
381 return _unique_predicate(entry->id()) ? write__artifact__cstring__entry__(this->_writer, entry) : 0; |
382 } |
382 } |
383 SymbolEntryPtr entry = this->_artifacts->map_symbol(ik->name()); |
383 SymbolEntryPtr entry = this->_artifacts->map_symbol(ik->name()); |
384 assert(entry != NULL, "invariant"); |
384 assert(entry != NULL, "invariant"); |
430 } |
430 } |
431 |
431 |
432 template <template <typename> class Predicate> |
432 template <template <typename> class Predicate> |
433 int KlassSymbolWriterImpl<Predicate>::class_loader_symbols(CldPtr cld) { |
433 int KlassSymbolWriterImpl<Predicate>::class_loader_symbols(CldPtr cld) { |
434 assert(cld != NULL, "invariant"); |
434 assert(cld != NULL, "invariant"); |
435 assert(!cld->is_anonymous(), "invariant"); |
435 assert(!cld->is_unsafe_anonymous(), "invariant"); |
436 int count = 0; |
436 int count = 0; |
437 // class loader type |
437 // class loader type |
438 const Klass* class_loader_klass = cld->class_loader_klass(); |
438 const Klass* class_loader_klass = cld->class_loader_klass(); |
439 if (class_loader_klass == NULL) { |
439 if (class_loader_klass == NULL) { |
440 // (primordial) boot class loader |
440 // (primordial) boot class loader |
694 public: |
694 public: |
695 typedef CldPtr TypePtr; |
695 typedef CldPtr TypePtr; |
696 static TypePtr select(KlassPtr klass) { |
696 static TypePtr select(KlassPtr klass) { |
697 assert(klass != NULL, "invariant"); |
697 assert(klass != NULL, "invariant"); |
698 CldPtr cld = klass->class_loader_data(); |
698 CldPtr cld = klass->class_loader_data(); |
699 return cld->is_anonymous() ? NULL : cld; |
699 return cld->is_unsafe_anonymous() ? NULL : cld; |
700 } |
700 } |
701 }; |
701 }; |
702 |
702 |
703 typedef KlassToFieldEnvelope<CldFieldSelector, CldWriterWithClear> KlassCldWriterWithClear; |
703 typedef KlassToFieldEnvelope<CldFieldSelector, CldWriterWithClear> KlassCldWriterWithClear; |
704 typedef KlassToFieldEnvelope<CldFieldSelector, CompositeCldWriterWithClear> KlassCompositeCldWriterWithClear; |
704 typedef KlassToFieldEnvelope<CldFieldSelector, CompositeCldWriterWithClear> KlassCompositeCldWriterWithClear; |
920 bool _class_unload; |
920 bool _class_unload; |
921 public: |
921 public: |
922 CLDCallback(bool class_unload) : _class_unload(class_unload) {} |
922 CLDCallback(bool class_unload) : _class_unload(class_unload) {} |
923 void do_cld(ClassLoaderData* cld) { |
923 void do_cld(ClassLoaderData* cld) { |
924 assert(cld != NULL, "invariant"); |
924 assert(cld != NULL, "invariant"); |
925 if (cld->is_anonymous()) { |
925 if (cld->is_unsafe_anonymous()) { |
926 return; |
926 return; |
927 } |
927 } |
928 if (_class_unload) { |
928 if (_class_unload) { |
929 JfrTypeSet::do_unloaded_class_loader_data(cld); |
929 JfrTypeSet::do_unloaded_class_loader_data(cld); |
930 return; |
930 return; |