1.1 --- a/src/share/vm/jfr/recorder/checkpoint/types/jfrTypeSet.cpp Fri Jun 12 02:59:56 2020 +0100 1.2 +++ b/src/share/vm/jfr/recorder/checkpoint/types/jfrTypeSet.cpp Mon Jun 15 14:08:11 2020 +0300 1.3 @@ -52,6 +52,7 @@ 1.4 // creates a unique id by combining a checkpoint relative symbol id (2^24) 1.5 // with the current checkpoint id (2^40) 1.6 #define CREATE_SYMBOL_ID(sym_id) (((u8)((checkpoint_id << 24) | sym_id))) 1.7 +#define CREATE_PACKAGE_ID(pkg_id) (((u8)((checkpoint_id << 24) | pkg_id))) 1.8 1.9 typedef const Klass* KlassPtr; 1.10 // XXX typedef const PackageEntry* PkgPtr; 1.11 @@ -61,12 +62,23 @@ 1.12 typedef const JfrSymbolId::SymbolEntry* SymbolEntryPtr; 1.13 typedef const JfrSymbolId::CStringEntry* CStringEntryPtr; 1.14 1.15 -// XXX 1.16 -// static traceid package_id(KlassPtr klass) { 1.17 -// assert(klass != NULL, "invariant"); 1.18 -// PkgPtr pkg_entry = klass->package(); 1.19 -// return pkg_entry == NULL ? 0 : TRACE_ID(pkg_entry); 1.20 -// } 1.21 +inline uintptr_t package_name_hash(const char *s) { 1.22 + uintptr_t val = 0; 1.23 + while (*s != 0) { 1.24 + val = *s++ + 31 * val; 1.25 + } 1.26 + return val; 1.27 +} 1.28 + 1.29 +static traceid package_id(KlassPtr klass, JfrArtifactSet* artifacts) { 1.30 + assert(klass != NULL, "invariant"); 1.31 + char* klass_name = klass->name()->as_C_string(); // uses ResourceMark declared in JfrTypeSet::serialize() 1.32 + const char* pkg_name = ClassLoader::package_from_name(klass_name, NULL); 1.33 + if (pkg_name == NULL) { 1.34 + return 0; 1.35 + } 1.36 + return CREATE_PACKAGE_ID(artifacts->markPackage(pkg_name, package_name_hash(pkg_name))); 1.37 +} 1.38 1.39 static traceid cld_id(CldPtr cld) { 1.40 assert(cld != NULL, "invariant"); 1.41 @@ -125,7 +137,7 @@ 1.42 theklass = obj_arr_klass->bottom_klass(); 1.43 } 1.44 if (theklass->oop_is_instance()) { 1.45 - pkg_id = 0; // XXX package_id(theklass); 1.46 + pkg_id = package_id(theklass, artifacts); 1.47 } else { 1.48 assert(theklass->oop_is_typeArray(), "invariant"); 1.49 } 1.50 @@ -169,28 +181,19 @@ 1.51 typedef JfrArtifactWriterImplHost<MethodPtr, write__artifact__method> MethodWriterImplTarget; 1.52 typedef JfrArtifactWriterHost<MethodWriterImplTarget, TYPE_METHOD> MethodWriterImpl; 1.53 1.54 -// XXX 1.55 -// int write__artifact__package(JfrCheckpointWriter* writer, JfrArtifactSet* artifacts, const void* p) { 1.56 -// assert(writer != NULL, "invariant"); 1.57 -// assert(artifacts != NULL, "invariant"); 1.58 -// assert(p != NULL, "invariant"); 1.59 -// PkgPtr pkg = (PkgPtr)p; 1.60 -// Symbol* const pkg_name = pkg->name(); 1.61 -// const traceid package_name_symbol_id = pkg_name != NULL ? artifacts->mark(pkg_name) : 0; 1.62 -// assert(package_name_symbol_id > 0, "invariant"); 1.63 -// writer->write((traceid)TRACE_ID(pkg)); 1.64 -// writer->write((traceid)CREATE_SYMBOL_ID(package_name_symbol_id)); 1.65 -// writer->write((bool)pkg->is_exported()); 1.66 -// return 1; 1.67 -// } 1.68 +int write__artifact__package(JfrCheckpointWriter* writer, JfrArtifactSet* artifacts, const void* p) { 1.69 + assert(writer != NULL, "invariant"); 1.70 + assert(artifacts != NULL, "invariant"); 1.71 + assert(p != NULL, "invariant"); 1.72 1.73 -// typedef LeakPredicate<PkgPtr> LeakPackagePredicate; 1.74 -// int _compare_pkg_ptr_(PkgPtr const& lhs, PkgPtr const& rhs) { return lhs > rhs ? 1 : (lhs < rhs) ? -1 : 0; } 1.75 -// typedef UniquePredicate<PkgPtr, _compare_pkg_ptr_> PackagePredicate; 1.76 -// typedef JfrPredicatedArtifactWriterImplHost<PkgPtr, LeakPackagePredicate, write__artifact__package> LeakPackageWriterImpl; 1.77 -// typedef JfrPredicatedArtifactWriterImplHost<PkgPtr, PackagePredicate, write__artifact__package> PackageWriterImpl; 1.78 -// typedef JfrArtifactWriterHost<LeakPackageWriterImpl, TYPE_PACKAGE> LeakPackageWriter; 1.79 -// typedef JfrArtifactWriterHost<PackageWriterImpl, TYPE_PACKAGE> PackageWriter; 1.80 + CStringEntryPtr entry = (CStringEntryPtr)p; 1.81 + const traceid package_name_symbol_id = artifacts->mark(entry->value(), package_name_hash(entry->value())); 1.82 + assert(package_name_symbol_id > 0, "invariant"); 1.83 + writer->write((traceid)CREATE_PACKAGE_ID(entry->id())); 1.84 + writer->write((traceid)CREATE_SYMBOL_ID(package_name_symbol_id)); 1.85 + writer->write((bool)true); // exported 1.86 + return 1; 1.87 +} 1.88 1.89 int write__artifact__classloader(JfrCheckpointWriter* writer, JfrArtifactSet* artifacts, const void* c) { 1.90 assert(c != NULL, "invariant"); 1.91 @@ -525,99 +528,17 @@ 1.92 do_klasses(); 1.93 } 1.94 1.95 -// XXX 1.96 -// typedef CompositeFunctor<PkgPtr, 1.97 -// PackageWriter, 1.98 -// ClearArtifact<PkgPtr> > PackageWriterWithClear; 1.99 +typedef JfrArtifactWriterImplHost<CStringEntryPtr, write__artifact__package> PackageEntryWriterImpl; 1.100 +typedef JfrArtifactWriterHost<PackageEntryWriterImpl, TYPE_PACKAGE> PackageEntryWriter; 1.101 1.102 -// typedef CompositeFunctor<PkgPtr, 1.103 -// LeakPackageWriter, 1.104 -// PackageWriter> CompositePackageWriter; 1.105 - 1.106 -// typedef CompositeFunctor<PkgPtr, 1.107 -// CompositePackageWriter, 1.108 -// ClearArtifact<PkgPtr> > CompositePackageWriterWithClear; 1.109 - 1.110 -// class PackageFieldSelector { 1.111 -// public: 1.112 -// typedef PkgPtr TypePtr; 1.113 -// static TypePtr select(KlassPtr klass) { 1.114 -// assert(klass != NULL, "invariant"); 1.115 -// return ((InstanceKlass*)klass)->package(); 1.116 -// } 1.117 -// }; 1.118 - 1.119 -// typedef KlassToFieldEnvelope<PackageFieldSelector, 1.120 -// PackageWriterWithClear> KlassPackageWriterWithClear; 1.121 - 1.122 -// typedef KlassToFieldEnvelope<PackageFieldSelector, 1.123 -// CompositePackageWriterWithClear> KlassCompositePackageWriterWithClear; 1.124 - 1.125 -// typedef JfrArtifactCallbackHost<PkgPtr, PackageWriterWithClear> PackageCallback; 1.126 -// typedef JfrArtifactCallbackHost<PkgPtr, CompositePackageWriterWithClear> CompositePackageCallback; 1.127 - 1.128 -// /* 1.129 -// * Composite operation 1.130 -// * 1.131 -// * LeakpPackageWriter -> 1.132 -// * PackageWriter -> 1.133 -// * ClearArtifact<PackageEntry> 1.134 -// * 1.135 -// */ 1.136 -// void JfrTypeSet::write_package_constants(JfrCheckpointWriter* writer, JfrCheckpointWriter* leakp_writer) { 1.137 -// assert(_artifacts->has_klass_entries(), "invariant"); 1.138 -// ClearArtifact<PkgPtr> clear(_class_unload); 1.139 -// PackageWriter pw(writer, _artifacts, _class_unload); 1.140 -// if (leakp_writer == NULL) { 1.141 -// PackageWriterWithClear pwwc(&pw, &clear); 1.142 -// KlassPackageWriterWithClear kpwwc(&pwwc); 1.143 -// _artifacts->iterate_klasses(kpwwc); 1.144 -// PackageCallback callback(&pwwc); 1.145 -// _subsystem_callback = &callback; 1.146 -// do_packages(); 1.147 -// return; 1.148 -// } 1.149 -// LeakPackageWriter lpw(leakp_writer, _artifacts, _class_unload); 1.150 -// CompositePackageWriter cpw(&lpw, &pw); 1.151 -// CompositePackageWriterWithClear cpwwc(&cpw, &clear); 1.152 -// KlassCompositePackageWriterWithClear ckpw(&cpwwc); 1.153 -// _artifacts->iterate_klasses(ckpw); 1.154 -// CompositePackageCallback callback(&cpwwc); 1.155 -// _subsystem_callback = &callback; 1.156 -// do_packages(); 1.157 -// } 1.158 - 1.159 -// typedef CompositeFunctor<ModPtr, 1.160 -// ModuleWriter, 1.161 -// ClearArtifact<ModPtr> > ModuleWriterWithClear; 1.162 - 1.163 -// typedef CompositeFunctor<ModPtr, 1.164 -// LeakModuleWriter, 1.165 -// ModuleWriter> CompositeModuleWriter; 1.166 - 1.167 -// typedef CompositeFunctor<ModPtr, 1.168 -// CompositeModuleWriter, 1.169 -// ClearArtifact<ModPtr> > CompositeModuleWriterWithClear; 1.170 - 1.171 -// typedef JfrArtifactCallbackHost<ModPtr, ModuleWriterWithClear> ModuleCallback; 1.172 -// typedef JfrArtifactCallbackHost<ModPtr, CompositeModuleWriterWithClear> CompositeModuleCallback; 1.173 - 1.174 -// XXX 1.175 -// class ModuleFieldSelector { 1.176 -// public: 1.177 -// typedef ModPtr TypePtr; 1.178 -// static TypePtr select(KlassPtr klass) { 1.179 -// assert(klass != NULL, "invariant"); 1.180 -// PkgPtr pkg = klass->package(); 1.181 -// return pkg != NULL ? pkg->module() : NULL; 1.182 -// } 1.183 -// }; 1.184 - 1.185 -// typedef KlassToFieldEnvelope<ModuleFieldSelector, 1.186 -// ModuleWriterWithClear> KlassModuleWriterWithClear; 1.187 - 1.188 -// typedef KlassToFieldEnvelope<ModuleFieldSelector, 1.189 -// CompositeModuleWriterWithClear> KlassCompositeModuleWriterWithClear; 1.190 +void JfrTypeSet::write_package_constants(JfrCheckpointWriter* writer, JfrCheckpointWriter* leakp_writer) { 1.191 + assert(_artifacts->has_klass_entries(), "invariant"); 1.192 + assert(writer != NULL, "invariant"); 1.193 + // below jdk9 there is no oop for packages, so nothing to do with leakp_writer 1.194 + // just write packages 1.195 + PackageEntryWriter pw(writer, _artifacts, _class_unload); 1.196 + _artifacts->iterate_packages(pw); 1.197 +} 1.198 1.199 typedef CompositeFunctor<CldPtr, CldWriter, ClearArtifact<CldPtr> > CldWriterWithClear; 1.200 typedef CompositeFunctor<CldPtr, LeakCldWriter, CldWriter> CompositeCldWriter; 1.201 @@ -892,7 +813,7 @@ 1.202 // might tag an artifact to be written in a subsequent step 1.203 write_klass_constants(writer, leakp_writer); 1.204 if (_artifacts->has_klass_entries()) { 1.205 -// XXX write_package_constants(writer, leakp_writer); 1.206 + write_package_constants(writer, leakp_writer); 1.207 write_class_loader_constants(writer, leakp_writer); 1.208 write_method_constants(writer, leakp_writer); 1.209 write_symbol_constants(writer, leakp_writer);