223 int _compare_mod_ptr_(ModPtr const& lhs, ModPtr const& rhs) { return lhs > rhs ? 1 : (lhs < rhs) ? -1 : 0; }
224 typedef UniquePredicate<ModPtr, _compare_mod_ptr_> ModulePredicate;
225 typedef JfrPredicatedArtifactWriterImplHost<ModPtr, LeakModulePredicate, write__artifact__module> LeakModuleWriterImpl;
226 typedef JfrPredicatedArtifactWriterImplHost<ModPtr, ModulePredicate, write__artifact__module> ModuleWriterImpl;
227 typedef JfrArtifactWriterHost<LeakModuleWriterImpl, TYPE_MODULE> LeakModuleWriter;
228 typedef JfrArtifactWriterHost<ModuleWriterImpl, TYPE_MODULE> ModuleWriter;
229
230 int write__artifact__classloader(JfrCheckpointWriter* writer, JfrArtifactSet* artifacts, const void* c) {
231 assert(c != NULL, "invariant");
232 CldPtr cld = (CldPtr)c;
233 assert(!cld->is_anonymous(), "invariant");
234 const traceid cld_id = TRACE_ID(cld);
235 // class loader type
236 const Klass* class_loader_klass = cld->class_loader_klass();
237 if (class_loader_klass == NULL) {
238 // (primordial) boot class loader
239 writer->write(cld_id); // class loader instance id
240 writer->write((traceid)0); // class loader type id (absence of)
241 writer->write((traceid)CREATE_SYMBOL_ID(1)); // 1 maps to synthetic name -> "boot"
242 } else {
243 Symbol* symbol_name = cld->class_loader_name();
244 const traceid symbol_name_id = symbol_name != NULL ? artifacts->mark(symbol_name) : 0;
245 writer->write(cld_id); // class loader instance id
246 writer->write(TRACE_ID(class_loader_klass)); // class loader type id
247 writer->write(symbol_name_id == 0 ? (traceid)0 :
248 (traceid)CREATE_SYMBOL_ID(symbol_name_id)); // class loader instance name
249 }
250 return 1;
251 }
252
253 typedef LeakPredicate<CldPtr> LeakCldPredicate;
254 int _compare_cld_ptr_(CldPtr const& lhs, CldPtr const& rhs) { return lhs > rhs ? 1 : (lhs < rhs) ? -1 : 0; }
255 typedef UniquePredicate<CldPtr, _compare_cld_ptr_> CldPredicate;
256 typedef JfrPredicatedArtifactWriterImplHost<CldPtr, LeakCldPredicate, write__artifact__classloader> LeakCldWriterImpl;
257 typedef JfrPredicatedArtifactWriterImplHost<CldPtr, CldPredicate, write__artifact__classloader> CldWriterImpl;
258 typedef JfrArtifactWriterHost<LeakCldWriterImpl, TYPE_CLASSLOADER> LeakCldWriter;
259 typedef JfrArtifactWriterHost<CldWriterImpl, TYPE_CLASSLOADER> CldWriter;
260
261 typedef const JfrSymbolId::SymbolEntry* SymbolEntryPtr;
262
263 static int write__artifact__symbol__entry__(JfrCheckpointWriter* writer,
424 assert(entry != NULL, "invariant");
425 if (_unique_predicate(entry->id())) {
426 count += write__artifact__symbol__entry__(this->_writer, entry);
427 }
428 }
429 return count;
430 }
431
432 template <template <typename> class Predicate>
433 int KlassSymbolWriterImpl<Predicate>::class_loader_symbols(CldPtr cld) {
434 assert(cld != NULL, "invariant");
435 assert(!cld->is_anonymous(), "invariant");
436 int count = 0;
437 // class loader type
438 const Klass* class_loader_klass = cld->class_loader_klass();
439 if (class_loader_klass == NULL) {
440 // (primordial) boot class loader
441 CStringEntryPtr entry = this->_artifacts->map_cstring(0);
442 assert(entry != NULL, "invariant");
443 assert(strncmp(entry->literal(),
444 boot_class_loader_name,
445 strlen(boot_class_loader_name)) == 0, "invariant");
446 if (_unique_predicate(entry->id())) {
447 count += write__artifact__cstring__entry__(this->_writer, entry);
448 }
449 } else {
450 const Symbol* class_loader_name = cld->class_loader_name();
451 if (class_loader_name != NULL) {
452 SymbolEntryPtr entry = this->_artifacts->map_symbol(class_loader_name);
453 assert(entry != NULL, "invariant");
454 if (_unique_predicate(entry->id())) {
455 count += write__artifact__symbol__entry__(this->_writer, entry);
456 }
457 }
458 }
459 return count;
460 }
461
462 template <template <typename> class Predicate>
463 int KlassSymbolWriterImpl<Predicate>::method_symbols(KlassPtr klass) {
464 assert(_predicate(klass), "invariant");
465 assert(_method_used_predicate(klass), "invariant");
466 assert(METHOD_AND_CLASS_USED_ANY_EPOCH(klass), "invariant");
467 int count = 0;
468 const InstanceKlass* const ik = InstanceKlass::cast(klass);
469 const int len = ik->methods()->length();
470 for (int i = 0; i < len; ++i) {
|
223 int _compare_mod_ptr_(ModPtr const& lhs, ModPtr const& rhs) { return lhs > rhs ? 1 : (lhs < rhs) ? -1 : 0; }
224 typedef UniquePredicate<ModPtr, _compare_mod_ptr_> ModulePredicate;
225 typedef JfrPredicatedArtifactWriterImplHost<ModPtr, LeakModulePredicate, write__artifact__module> LeakModuleWriterImpl;
226 typedef JfrPredicatedArtifactWriterImplHost<ModPtr, ModulePredicate, write__artifact__module> ModuleWriterImpl;
227 typedef JfrArtifactWriterHost<LeakModuleWriterImpl, TYPE_MODULE> LeakModuleWriter;
228 typedef JfrArtifactWriterHost<ModuleWriterImpl, TYPE_MODULE> ModuleWriter;
229
230 int write__artifact__classloader(JfrCheckpointWriter* writer, JfrArtifactSet* artifacts, const void* c) {
231 assert(c != NULL, "invariant");
232 CldPtr cld = (CldPtr)c;
233 assert(!cld->is_anonymous(), "invariant");
234 const traceid cld_id = TRACE_ID(cld);
235 // class loader type
236 const Klass* class_loader_klass = cld->class_loader_klass();
237 if (class_loader_klass == NULL) {
238 // (primordial) boot class loader
239 writer->write(cld_id); // class loader instance id
240 writer->write((traceid)0); // class loader type id (absence of)
241 writer->write((traceid)CREATE_SYMBOL_ID(1)); // 1 maps to synthetic name -> "boot"
242 } else {
243 Symbol* symbol_name = cld->name();
244 const traceid symbol_name_id = symbol_name != NULL ? artifacts->mark(symbol_name) : 0;
245 writer->write(cld_id); // class loader instance id
246 writer->write(TRACE_ID(class_loader_klass)); // class loader type id
247 writer->write(symbol_name_id == 0 ? (traceid)0 :
248 (traceid)CREATE_SYMBOL_ID(symbol_name_id)); // class loader instance name
249 }
250 return 1;
251 }
252
253 typedef LeakPredicate<CldPtr> LeakCldPredicate;
254 int _compare_cld_ptr_(CldPtr const& lhs, CldPtr const& rhs) { return lhs > rhs ? 1 : (lhs < rhs) ? -1 : 0; }
255 typedef UniquePredicate<CldPtr, _compare_cld_ptr_> CldPredicate;
256 typedef JfrPredicatedArtifactWriterImplHost<CldPtr, LeakCldPredicate, write__artifact__classloader> LeakCldWriterImpl;
257 typedef JfrPredicatedArtifactWriterImplHost<CldPtr, CldPredicate, write__artifact__classloader> CldWriterImpl;
258 typedef JfrArtifactWriterHost<LeakCldWriterImpl, TYPE_CLASSLOADER> LeakCldWriter;
259 typedef JfrArtifactWriterHost<CldWriterImpl, TYPE_CLASSLOADER> CldWriter;
260
261 typedef const JfrSymbolId::SymbolEntry* SymbolEntryPtr;
262
263 static int write__artifact__symbol__entry__(JfrCheckpointWriter* writer,
424 assert(entry != NULL, "invariant");
425 if (_unique_predicate(entry->id())) {
426 count += write__artifact__symbol__entry__(this->_writer, entry);
427 }
428 }
429 return count;
430 }
431
432 template <template <typename> class Predicate>
433 int KlassSymbolWriterImpl<Predicate>::class_loader_symbols(CldPtr cld) {
434 assert(cld != NULL, "invariant");
435 assert(!cld->is_anonymous(), "invariant");
436 int count = 0;
437 // class loader type
438 const Klass* class_loader_klass = cld->class_loader_klass();
439 if (class_loader_klass == NULL) {
440 // (primordial) boot class loader
441 CStringEntryPtr entry = this->_artifacts->map_cstring(0);
442 assert(entry != NULL, "invariant");
443 assert(strncmp(entry->literal(),
444 BOOTSTRAP_LOADER_NAME,
445 BOOTSTRAP_LOADER_NAME_LEN) == 0, "invariant");
446 if (_unique_predicate(entry->id())) {
447 count += write__artifact__cstring__entry__(this->_writer, entry);
448 }
449 } else {
450 const Symbol* class_loader_name = cld->name();
451 if (class_loader_name != NULL) {
452 SymbolEntryPtr entry = this->_artifacts->map_symbol(class_loader_name);
453 assert(entry != NULL, "invariant");
454 if (_unique_predicate(entry->id())) {
455 count += write__artifact__symbol__entry__(this->_writer, entry);
456 }
457 }
458 }
459 return count;
460 }
461
462 template <template <typename> class Predicate>
463 int KlassSymbolWriterImpl<Predicate>::method_symbols(KlassPtr klass) {
464 assert(_predicate(klass), "invariant");
465 assert(_method_used_predicate(klass), "invariant");
466 assert(METHOD_AND_CLASS_USED_ANY_EPOCH(klass), "invariant");
467 int count = 0;
468 const InstanceKlass* const ik = InstanceKlass::cast(klass);
469 const int len = ik->methods()->length();
470 for (int i = 0; i < len; ++i) {
|