src/share/vm/jfr/recorder/checkpoint/types/jfrTypeSet.cpp

changeset 9926
d20a5f399218
parent 9858
b985cbb00e68
child 9949
fb74ae591209
     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);

mercurial