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"); |