src/hotspot/share/jfr/recorder/checkpoint/types/jfrTypeSetUtils.cpp
changeset 51444 3e5d28e6de32
parent 51334 cc2c79d22508
child 53176 6af596144294
equal deleted inserted replaced
51443:cdffba164671 51444:3e5d28e6de32
    57 JfrSymbolId::~JfrSymbolId() {
    57 JfrSymbolId::~JfrSymbolId() {
    58   delete _sym_table;
    58   delete _sym_table;
    59   delete _cstring_table;
    59   delete _cstring_table;
    60 }
    60 }
    61 
    61 
    62 traceid JfrSymbolId::mark_anonymous_klass_name(const Klass* k) {
    62 traceid JfrSymbolId::mark_unsafe_anonymous_klass_name(const Klass* k) {
    63   assert(k != NULL, "invariant");
    63   assert(k != NULL, "invariant");
    64   assert(k->is_instance_klass(), "invariant");
    64   assert(k->is_instance_klass(), "invariant");
    65   assert(is_anonymous_klass(k), "invariant");
    65   assert(is_unsafe_anonymous_klass(k), "invariant");
    66 
    66 
    67   uintptr_t anonymous_symbol_hash_code = 0;
    67   uintptr_t anonymous_symbol_hash_code = 0;
    68   const char* const anonymous_symbol =
    68   const char* const anonymous_symbol =
    69     create_anonymous_klass_symbol((const InstanceKlass*)k, anonymous_symbol_hash_code);
    69     create_unsafe_anonymous_klass_symbol((const InstanceKlass*)k, anonymous_symbol_hash_code);
    70 
    70 
    71   if (anonymous_symbol == NULL) {
    71   if (anonymous_symbol == NULL) {
    72     return 0;
    72     return 0;
    73   }
    73   }
    74 
    74 
   117 }
   117 }
   118 
   118 
   119 traceid JfrSymbolId::mark(const Klass* k) {
   119 traceid JfrSymbolId::mark(const Klass* k) {
   120   assert(k != NULL, "invariant");
   120   assert(k != NULL, "invariant");
   121   traceid symbol_id = 0;
   121   traceid symbol_id = 0;
   122   if (is_anonymous_klass(k)) {
   122   if (is_unsafe_anonymous_klass(k)) {
   123     symbol_id = mark_anonymous_klass_name(k);
   123     symbol_id = mark_unsafe_anonymous_klass_name(k);
   124   }
   124   }
   125   if (0 == symbol_id) {
   125   if (0 == symbol_id) {
   126     const Symbol* const sym = k->name();
   126     const Symbol* const sym = k->name();
   127     if (sym != NULL) {
   127     if (sym != NULL) {
   128       symbol_id = mark(sym);
   128       symbol_id = mark(sym);
   146 traceid JfrSymbolId::mark(const char* str, uintptr_t hash) {
   146 traceid JfrSymbolId::mark(const char* str, uintptr_t hash) {
   147   assert(str != NULL, "invariant");
   147   assert(str != NULL, "invariant");
   148   return _cstring_table->id(str, hash);
   148   return _cstring_table->id(str, hash);
   149 }
   149 }
   150 
   150 
   151 bool JfrSymbolId::is_anonymous_klass(const Klass* k) {
   151 bool JfrSymbolId::is_unsafe_anonymous_klass(const Klass* k) {
   152   assert(k != NULL, "invariant");
   152   assert(k != NULL, "invariant");
   153   return k->is_instance_klass() && ((const InstanceKlass*)k)->is_anonymous();
   153   return k->is_instance_klass() && ((const InstanceKlass*)k)->is_unsafe_anonymous();
   154 }
   154 }
   155 
   155 
   156 /*
   156 /*
   157 * jsr292 anonymous classes symbol is the external name +
   157 * jsr292 anonymous classes symbol is the external name +
   158 * the identity_hashcode slash appended:
   158 * the identity_hashcode slash appended:
   159 *   java.lang.invoke.LambdaForm$BMH/22626602
   159 *   java.lang.invoke.LambdaForm$BMH/22626602
   160 *
   160 *
   161 * caller needs ResourceMark
   161 * caller needs ResourceMark
   162 */
   162 */
   163 
   163 
   164 uintptr_t JfrSymbolId::anonymous_klass_name_hash_code(const InstanceKlass* ik) {
   164 uintptr_t JfrSymbolId::unsafe_anonymous_klass_name_hash_code(const InstanceKlass* ik) {
   165   assert(ik != NULL, "invariant");
   165   assert(ik != NULL, "invariant");
   166   assert(ik->is_anonymous(), "invariant");
   166   assert(ik->is_unsafe_anonymous(), "invariant");
   167   const oop mirror = ik->java_mirror();
   167   const oop mirror = ik->java_mirror();
   168   assert(mirror != NULL, "invariant");
   168   assert(mirror != NULL, "invariant");
   169   return (uintptr_t)mirror->identity_hash();
   169   return (uintptr_t)mirror->identity_hash();
   170 }
   170 }
   171 
   171 
   172 const char* JfrSymbolId::create_anonymous_klass_symbol(const InstanceKlass* ik, uintptr_t& hashcode) {
   172 const char* JfrSymbolId::create_unsafe_anonymous_klass_symbol(const InstanceKlass* ik, uintptr_t& hashcode) {
   173   assert(ik != NULL, "invariant");
   173   assert(ik != NULL, "invariant");
   174   assert(ik->is_anonymous(), "invariant");
   174   assert(ik->is_unsafe_anonymous(), "invariant");
   175   assert(0 == hashcode, "invariant");
   175   assert(0 == hashcode, "invariant");
   176   char* anonymous_symbol = NULL;
   176   char* anonymous_symbol = NULL;
   177   const oop mirror = ik->java_mirror();
   177   const oop mirror = ik->java_mirror();
   178   assert(mirror != NULL, "invariant");
   178   assert(mirror != NULL, "invariant");
   179   char hash_buf[40];
   179   char hash_buf[40];
   180   hashcode = anonymous_klass_name_hash_code(ik);
   180   hashcode = unsafe_anonymous_klass_name_hash_code(ik);
   181   sprintf(hash_buf, "/" UINTX_FORMAT, hashcode);
   181   sprintf(hash_buf, "/" UINTX_FORMAT, hashcode);
   182   const size_t hash_len = strlen(hash_buf);
   182   const size_t hash_len = strlen(hash_buf);
   183   const size_t result_len = ik->name()->utf8_length();
   183   const size_t result_len = ik->name()->utf8_length();
   184   anonymous_symbol = NEW_RESOURCE_ARRAY(char, result_len + hash_len + 1);
   184   anonymous_symbol = NEW_RESOURCE_ARRAY(char, result_len + hash_len + 1);
   185   ik->name()->as_klass_external_name(anonymous_symbol, (int)result_len + 1);
   185   ik->name()->as_klass_external_name(anonymous_symbol, (int)result_len + 1);
   221 void JfrArtifactSet::clear() {
   221 void JfrArtifactSet::clear() {
   222   _symbol_id->clear();
   222   _symbol_id->clear();
   223   // _klass_list will be cleared by a ResourceMark
   223   // _klass_list will be cleared by a ResourceMark
   224 }
   224 }
   225 
   225 
   226 traceid JfrArtifactSet::mark_anonymous_klass_name(const Klass* klass) {
   226 traceid JfrArtifactSet::mark_unsafe_anonymous_klass_name(const Klass* klass) {
   227   return _symbol_id->mark_anonymous_klass_name(klass);
   227   return _symbol_id->mark_unsafe_anonymous_klass_name(klass);
   228 }
   228 }
   229 
   229 
   230 traceid JfrArtifactSet::mark(const Symbol* sym, uintptr_t hash) {
   230 traceid JfrArtifactSet::mark(const Symbol* sym, uintptr_t hash) {
   231   return _symbol_id->mark(sym, hash);
   231   return _symbol_id->mark(sym, hash);
   232 }
   232 }