Skip to content

Commit c71add0

Browse files
committed
Backport 0f667103db7842fe9d3399f56baee0a5def4529e
1 parent 3daec25 commit c71add0

File tree

2 files changed

+19
-57
lines changed

2 files changed

+19
-57
lines changed

src/hotspot/share/jfr/support/jfrSymbolTable.cpp

Lines changed: 17 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -23,11 +23,10 @@
2323
*/
2424

2525
#include "precompiled.hpp"
26-
#include "classfile/javaClasses.inline.hpp"
2726
#include "classfile/classLoaderData.hpp"
27+
#include "classfile/javaClasses.hpp"
2828
#include "jfr/support/jfrSymbolTable.hpp"
29-
#include "oops/instanceKlass.hpp"
30-
#include "oops/oop.inline.hpp"
29+
#include "oops/klass.hpp"
3130
#include "oops/symbol.hpp"
3231
#include "runtime/mutexLocker.hpp"
3332

@@ -200,7 +199,7 @@ traceid JfrSymbolTable::bootstrap_name(bool leakp) {
200199

201200
traceid JfrSymbolTable::mark(const Symbol* sym, bool leakp /* false */) {
202201
assert(sym != nullptr, "invariant");
203-
return mark((uintptr_t)sym->identity_hash(), sym, leakp);
202+
return mark(sym->identity_hash(), sym, leakp);
204203
}
205204

206205
traceid JfrSymbolTable::mark(uintptr_t hash, const Symbol* sym, bool leakp) {
@@ -236,59 +235,25 @@ traceid JfrSymbolTable::mark(uintptr_t hash, const char* str, bool leakp) {
236235
}
237236

238237
/*
239-
* hidden classes symbol is the external name +
240-
* the address of its InstanceKlass slash appended:
241-
* java.lang.invoke.LambdaForm$BMH/22626602
242-
*
243-
* caller needs ResourceMark
244-
*/
245-
246-
uintptr_t JfrSymbolTable::hidden_klass_name_hash(const InstanceKlass* ik) {
247-
assert(ik != nullptr, "invariant");
248-
assert(ik->is_hidden(), "invariant");
249-
const oop mirror = ik->java_mirror_no_keepalive();
250-
assert(mirror != nullptr, "invariant");
251-
return (uintptr_t)mirror->identity_hash();
252-
}
253-
254-
static const char* create_hidden_klass_symbol(const InstanceKlass* ik, uintptr_t hash) {
255-
assert(ik != nullptr, "invariant");
256-
assert(ik->is_hidden(), "invariant");
257-
assert(hash != 0, "invariant");
258-
char* hidden_symbol = nullptr;
259-
const oop mirror = ik->java_mirror_no_keepalive();
260-
assert(mirror != nullptr, "invariant");
261-
char hash_buf[40];
262-
os::snprintf_checked(hash_buf, sizeof(hash_buf), "/" UINTX_FORMAT, hash);
263-
const size_t hash_len = strlen(hash_buf);
264-
const size_t result_len = ik->name()->utf8_length();
265-
hidden_symbol = NEW_RESOURCE_ARRAY(char, result_len + hash_len + 1);
266-
ik->name()->as_klass_external_name(hidden_symbol, (int)result_len + 1);
267-
assert(strlen(hidden_symbol) == result_len, "invariant");
268-
strcpy(hidden_symbol + result_len, hash_buf);
269-
assert(strlen(hidden_symbol) == result_len + hash_len, "invariant");
270-
return hidden_symbol;
271-
}
272-
273-
bool JfrSymbolTable::is_hidden_klass(const Klass* k) {
238+
* The hidden class symbol is the external name with the
239+
* address of its Klass slash appended.
240+
*
241+
* "java.lang.invoke.LambdaForm$DMH/0x0000000037144c00"
242+
*
243+
* Caller needs ResourceMark.
244+
*/
245+
traceid JfrSymbolTable::mark_hidden_klass_name(const Klass* k, bool leakp) {
274246
assert(k != nullptr, "invariant");
275-
return k->is_instance_klass() && ((const InstanceKlass*)k)->is_hidden();
276-
}
277-
278-
traceid JfrSymbolTable::mark_hidden_klass_name(const InstanceKlass* ik, bool leakp) {
279-
assert(ik != nullptr, "invariant");
280-
assert(ik->is_hidden(), "invariant");
281-
const uintptr_t hash = hidden_klass_name_hash(ik);
282-
const char* const hidden_symbol = create_hidden_klass_symbol(ik, hash);
283-
return mark(hash, hidden_symbol, leakp);
247+
assert(k->is_hidden(), "invariant");
248+
const uintptr_t hash = k->name()->identity_hash();
249+
return mark(hash, k->external_name(), leakp);
284250
}
285251

286252
traceid JfrSymbolTable::mark(const Klass* k, bool leakp) {
287253
assert(k != nullptr, "invariant");
288254
traceid symbol_id = 0;
289-
if (is_hidden_klass(k)) {
290-
assert(k->is_instance_klass(), "invariant");
291-
symbol_id = mark_hidden_klass_name((const InstanceKlass*)k, leakp);
255+
if (k->is_hidden()) {
256+
symbol_id = mark_hidden_klass_name(k, leakp);
292257
} else {
293258
Symbol* const sym = k->name();
294259
if (sym != nullptr) {

src/hotspot/share/jfr/support/jfrSymbolTable.hpp

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -100,16 +100,13 @@ class JfrSymbolTable : public JfrCHeapObj {
100100
traceid mark(const Symbol* sym, bool leakp = false);
101101
traceid mark(const char* str, bool leakp = false);
102102
traceid mark(uintptr_t hash, const char* str, bool leakp);
103+
traceid mark_hidden_klass_name(const Klass* k, bool leakp);
103104
traceid bootstrap_name(bool leakp);
104105

105106
bool has_entries() const { return has_symbol_entries() || has_string_entries(); }
106107
bool has_symbol_entries() const { return _symbol_list != nullptr; }
107108
bool has_string_entries() const { return _string_list != nullptr; }
108109

109-
traceid mark_hidden_klass_name(const InstanceKlass* k, bool leakp);
110-
bool is_hidden_klass(const Klass* k);
111-
uintptr_t hidden_klass_name_hash(const InstanceKlass* ik);
112-
113110
// hashtable(s) callbacks
114111
void on_link(const SymbolEntry* entry);
115112
bool on_equals(uintptr_t hash, const SymbolEntry* entry);

0 commit comments

Comments
 (0)