diff -r f082177c5023 -r 10ecdb5d3574 src/hotspot/share/jfr/recorder/checkpoint/types/jfrThreadState.cpp --- a/src/hotspot/share/jfr/recorder/checkpoint/types/jfrThreadState.cpp Thu Sep 05 16:46:50 2019 +0200 +++ b/src/hotspot/share/jfr/recorder/checkpoint/types/jfrThreadState.cpp Mon Sep 09 13:26:35 2019 +0200 @@ -23,6 +23,7 @@ */ #include "precompiled.hpp" +#include "classfile/javaClasses.inline.hpp" #include "jfr/recorder/checkpoint/types/jfrThreadState.hpp" #include "jfr/recorder/checkpoint/jfrCheckpointWriter.hpp" #include "jfr/support/jfrThreadLocal.hpp" @@ -83,16 +84,6 @@ } } -const char* JfrThreadName::name(const Thread* t) { - assert(t != NULL, "invariant"); - if (!t->is_Java_thread()) { - return t->name(); - } - assert(t->is_Java_thread(), "invariant"); - const JavaThread* const jt = (JavaThread*)t; - return jt->get_thread_name_string(); -} - traceid JfrThreadId::id(const Thread* t) { assert(t != NULL, "invariant"); if (!t->is_Java_thread()) { @@ -113,3 +104,27 @@ assert(t != NULL, "invariant"); return t->jfr_thread_local()->thread_id(); } + +// caller needs ResourceMark +const char* get_java_thread_name(const Thread* t) { + assert(t != NULL, "invariant"); + assert(t->is_Java_thread(), "invariant"); + const JavaThread* const jt = ((JavaThread*)t); + const char* name_str = ""; + const oop thread_obj = jt->threadObj(); + if (thread_obj != NULL) { + const oop name = java_lang_Thread::name(thread_obj); + if (name != NULL) { + name_str = java_lang_String::as_utf8_string(name); + } + } else if (jt->is_attaching_via_jni()) { // workaround for 6412693 - see 6404306 + name_str = ""; + } + assert(name_str != NULL, "unexpected NULL thread name"); + return name_str; +} + +const char* JfrThreadName::name(const Thread* t) { + assert(t != NULL, "invariant"); + return t->is_Java_thread() ? get_java_thread_name(t) : t->name(); +}