src/hotspot/share/jfr/recorder/checkpoint/types/jfrTypeSetUtils.cpp
branchJEP-349-branch
changeset 57987 23e3cd901cb6
parent 57983 a57907813a83
child 58049 10ecdb5d3574
equal deleted inserted replaced
57985:be121cbf3284 57987:23e3cd901cb6
    86 void JfrSymbolId::unlink(const SymbolEntry* entry) {
    86 void JfrSymbolId::unlink(const SymbolEntry* entry) {
    87   assert(entry != NULL, "invariant");
    87   assert(entry != NULL, "invariant");
    88   const_cast<Symbol*>(entry->literal())->decrement_refcount();
    88   const_cast<Symbol*>(entry->literal())->decrement_refcount();
    89 }
    89 }
    90 
    90 
    91 static const char* resource_str_to_c_heap_str(const char* resource_str) {
       
    92   assert(resource_str != NULL, "invariant");
       
    93   const size_t length = strlen(resource_str);
       
    94   char* const c_string = JfrCHeapObj::new_array<char>(length + 1);
       
    95   assert(c_string != NULL, "invariant");
       
    96   strncpy(c_string, resource_str, length + 1);
       
    97   return c_string;
       
    98 }
       
    99 
       
   100 void JfrSymbolId::link(const CStringEntry* entry) {
    91 void JfrSymbolId::link(const CStringEntry* entry) {
   101   assert(entry != NULL, "invariant");
    92   assert(entry != NULL, "invariant");
   102   assert(entry->id() == 0, "invariant");
    93   assert(entry->id() == 0, "invariant");
   103   entry->set_id(++_symbol_id_counter);
    94   entry->set_id(++_symbol_id_counter);
   104   entry->set_list_next(_cstring_list);
    95   entry->set_list_next(_cstring_list);
   105   const char* const resource_str = entry->literal();
       
   106   const_cast<CStringEntry*>(entry)->set_literal(resource_str_to_c_heap_str(resource_str));
       
   107   _cstring_list = entry;
    96   _cstring_list = entry;
   108 }
    97 }
   109 
    98 
   110 bool JfrSymbolId::equals(uintptr_t hash, const CStringEntry* entry) {
    99 bool JfrSymbolId::equals(uintptr_t hash, const CStringEntry* entry) {
   111   assert(entry != NULL, "invariant");
   100   assert(entry != NULL, "invariant");
   114 }
   103 }
   115 
   104 
   116 void JfrSymbolId::unlink(const CStringEntry* entry) {
   105 void JfrSymbolId::unlink(const CStringEntry* entry) {
   117   assert(entry != NULL, "invariant");
   106   assert(entry != NULL, "invariant");
   118   if (entry->id() != 1) {
   107   if (entry->id() != 1) {
   119     JfrCHeapObj::free(const_cast<char*>(entry->literal()), 0);
   108     JfrCHeapObj::free(const_cast<char*>(entry->literal()), strlen(entry->literal() + 1));
   120   }
   109   }
   121 }
   110 }
   122 
   111 
   123 traceid JfrSymbolId::mark(const Symbol* symbol, bool leakp) {
   112 traceid JfrSymbolId::mark(const Symbol* symbol, bool leakp) {
   124   assert(symbol != NULL, "invariant");
   113   assert(symbol != NULL, "invariant");
   194   assert(mirror != NULL, "invariant");
   183   assert(mirror != NULL, "invariant");
   195   char hash_buf[40];
   184   char hash_buf[40];
   196   sprintf(hash_buf, "/" UINTX_FORMAT, hash);
   185   sprintf(hash_buf, "/" UINTX_FORMAT, hash);
   197   const size_t hash_len = strlen(hash_buf);
   186   const size_t hash_len = strlen(hash_buf);
   198   const size_t result_len = ik->name()->utf8_length();
   187   const size_t result_len = ik->name()->utf8_length();
   199   anonymous_symbol = NEW_RESOURCE_ARRAY(char, result_len + hash_len + 1);
   188   anonymous_symbol = JfrCHeapObj::new_array<char>(result_len + hash_len + 1);
   200   assert(anonymous_symbol != NULL, "invariant");
       
   201   ik->name()->as_klass_external_name(anonymous_symbol, (int)result_len + 1);
   189   ik->name()->as_klass_external_name(anonymous_symbol, (int)result_len + 1);
   202   assert(strlen(anonymous_symbol) == result_len, "invariant");
   190   assert(strlen(anonymous_symbol) == result_len, "invariant");
   203   strcpy(anonymous_symbol + result_len, hash_buf);
   191   strcpy(anonymous_symbol + result_len, hash_buf);
   204   assert(strlen(anonymous_symbol) == result_len + hash_len, "invariant");
   192   assert(strlen(anonymous_symbol) == result_len + hash_len, "invariant");
   205   return anonymous_symbol;
   193   return anonymous_symbol;
   220   if (hash == last_anonymous_hash) {
   208   if (hash == last_anonymous_hash) {
   221     assert(last_anonymous_id != 0, "invariant");
   209     assert(last_anonymous_id != 0, "invariant");
   222     return last_anonymous_id;
   210     return last_anonymous_id;
   223   }
   211   }
   224   last_anonymous_hash = hash;
   212   last_anonymous_hash = hash;
   225   last_anonymous_id = mark(hash, create_unsafe_anonymous_klass_symbol(ik, hash), leakp);
   213   const CStringEntry* const entry = _cstring_table->lookup_only(hash);
       
   214   last_anonymous_id = entry != NULL ? entry->id() : mark(hash, create_unsafe_anonymous_klass_symbol(ik, hash), leakp);
   226   return last_anonymous_id;
   215   return last_anonymous_id;
   227 }
   216 }
   228 
   217 
   229 traceid JfrSymbolId::mark(const Klass* k, bool leakp) {
   218 traceid JfrSymbolId::mark(const Klass* k, bool leakp) {
   230   assert(k != NULL, "invariant");
   219   assert(k != NULL, "invariant");