diff -r 2c3cc4b01880 -r c16ac7a2eba4 src/hotspot/share/jfr/recorder/checkpoint/types/jfrThreadState.cpp --- a/src/hotspot/share/jfr/recorder/checkpoint/types/jfrThreadState.cpp Wed Oct 30 16:14:56 2019 +0100 +++ b/src/hotspot/share/jfr/recorder/checkpoint/types/jfrThreadState.cpp Wed Oct 30 19:43:52 2019 +0100 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. +* Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,9 +23,13 @@ */ #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" #include "jvmtifiles/jvmti.h" +#include "runtime/osThread.hpp" +#include "runtime/thread.hpp" struct jvmti_thread_state { u8 id; @@ -80,3 +84,47 @@ } } +traceid JfrThreadId::id(const Thread* t) { + assert(t != NULL, "invariant"); + if (!t->is_Java_thread()) { + return os_id(t); + } + const JavaThread* const jt = (JavaThread*)t; + const oop thread_obj = jt->threadObj(); + return thread_obj != NULL ? java_lang_Thread::thread_id(thread_obj) : 0; +} + +traceid JfrThreadId::os_id(const Thread* t) { + assert(t != NULL, "invariant"); + const OSThread* const os_thread = t->osthread(); + return os_thread != NULL ? os_thread->thread_id() : 0; +} + +traceid JfrThreadId::jfr_id(const Thread* t) { + 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()) { + 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(); +}