src/hotspot/share/jfr/recorder/checkpoint/types/jfrTypeSetUtils.cpp
branchJEP-349-branch
changeset 57987 23e3cd901cb6
parent 57983 a57907813a83
child 58049 10ecdb5d3574
--- a/src/hotspot/share/jfr/recorder/checkpoint/types/jfrTypeSetUtils.cpp	Mon Sep 02 21:08:41 2019 +0200
+++ b/src/hotspot/share/jfr/recorder/checkpoint/types/jfrTypeSetUtils.cpp	Tue Sep 03 11:48:31 2019 +0200
@@ -88,22 +88,11 @@
   const_cast<Symbol*>(entry->literal())->decrement_refcount();
 }
 
-static const char* resource_str_to_c_heap_str(const char* resource_str) {
-  assert(resource_str != NULL, "invariant");
-  const size_t length = strlen(resource_str);
-  char* const c_string = JfrCHeapObj::new_array<char>(length + 1);
-  assert(c_string != NULL, "invariant");
-  strncpy(c_string, resource_str, length + 1);
-  return c_string;
-}
-
 void JfrSymbolId::link(const CStringEntry* entry) {
   assert(entry != NULL, "invariant");
   assert(entry->id() == 0, "invariant");
   entry->set_id(++_symbol_id_counter);
   entry->set_list_next(_cstring_list);
-  const char* const resource_str = entry->literal();
-  const_cast<CStringEntry*>(entry)->set_literal(resource_str_to_c_heap_str(resource_str));
   _cstring_list = entry;
 }
 
@@ -116,7 +105,7 @@
 void JfrSymbolId::unlink(const CStringEntry* entry) {
   assert(entry != NULL, "invariant");
   if (entry->id() != 1) {
-    JfrCHeapObj::free(const_cast<char*>(entry->literal()), 0);
+    JfrCHeapObj::free(const_cast<char*>(entry->literal()), strlen(entry->literal() + 1));
   }
 }
 
@@ -196,8 +185,7 @@
   sprintf(hash_buf, "/" UINTX_FORMAT, hash);
   const size_t hash_len = strlen(hash_buf);
   const size_t result_len = ik->name()->utf8_length();
-  anonymous_symbol = NEW_RESOURCE_ARRAY(char, result_len + hash_len + 1);
-  assert(anonymous_symbol != NULL, "invariant");
+  anonymous_symbol = JfrCHeapObj::new_array<char>(result_len + hash_len + 1);
   ik->name()->as_klass_external_name(anonymous_symbol, (int)result_len + 1);
   assert(strlen(anonymous_symbol) == result_len, "invariant");
   strcpy(anonymous_symbol + result_len, hash_buf);
@@ -222,7 +210,8 @@
     return last_anonymous_id;
   }
   last_anonymous_hash = hash;
-  last_anonymous_id = mark(hash, create_unsafe_anonymous_klass_symbol(ik, hash), leakp);
+  const CStringEntry* const entry = _cstring_table->lookup_only(hash);
+  last_anonymous_id = entry != NULL ? entry->id() : mark(hash, create_unsafe_anonymous_klass_symbol(ik, hash), leakp);
   return last_anonymous_id;
 }