1 /*
  2  * Copyright (c) 2016, 2022, Oracle and/or its affiliates. All rights reserved.
  3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  4  *
  5  * This code is free software; you can redistribute it and/or modify it
  6  * under the terms of the GNU General Public License version 2 only, as
  7  * published by the Free Software Foundation.  Oracle designates this
  8  * particular file as subject to the "Classpath" exception as provided
  9  * by Oracle in the LICENSE file that accompanied this code.
 10  *
 11  * This code is distributed in the hope that it will be useful, but WITHOUT
 12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 14  * version 2 for more details (a copy is included in the LICENSE file that
 15  * accompanied this code).
 16  *
 17  * You should have received a copy of the GNU General Public License version
 18  * 2 along with this work; if not, write to the Free Software Foundation,
 19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 20  *
 21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 22  * or visit www.oracle.com if you need additional information or have any
 23  * questions.
 24  */
 25 
 26 package jdk.jfr.consumer;
 27 
 28 import jdk.jfr.internal.consumer.ObjectContext;
 29 import jdk.internal.javac.PreviewFeature;
 30 
 31 /**
 32  * A recorded thread.
 33  *
 34  * @since 9
 35  */
 36 public final class RecordedThread extends RecordedObject {
 37     private final long uniqueId;
 38 
 39     // package private
 40     RecordedThread(ObjectContext objectContext, long id, Object[] values) {
 41         super(objectContext, values);
 42         this.uniqueId = id;
 43     }
 44 
 45     /**
 46      * Returns the thread name used by the operating system.
 47      *
 48      * @return the OS thread name, or {@code null} if doesn't exist
 49      */
 50     public String getOSName() {
 51         return getTyped("osName", String.class, null);
 52     }
 53 
 54     /**
 55      * Returns the thread ID used by the operating system.
 56      *
 57      * @return the OS thread ID, or {@code -1} if doesn't exist
 58      */
 59     public long getOSThreadId() {
 60         Long l = getTyped("osThreadId", Long.class, -1L);
 61         return l.longValue();
 62     }
 63 
 64     /**
 65      * Returns the Java thread group, if available.
 66      *
 67      * @return the thread group, or {@code null} if doesn't exist
 68      */
 69     public RecordedThreadGroup getThreadGroup() {
 70         return getTyped("group", RecordedThreadGroup.class, null);
 71     }
 72 
 73     /**
 74      * Returns the Java thread name, or {@code null} if doesn't exist.
 75      * <p>
 76      * Returns {@code java.lang.Thread.getName()} if the thread has a Java
 77      * representation. {@code null} otherwise.
 78      *
 79      * @return the Java thread name, or {@code null} if doesn't exist
 80      */
 81     public String getJavaName() {
 82         return getTyped("javaName", String.class, null);
 83     }
 84 
 85     /**
 86      * Returns the Java thread ID, or {@code -1} if it's not a Java thread.
 87      *
 88      * @return the Java thread ID, or {@code -1} if it's not a Java thread
 89      *
 90      * @see java.lang.Thread#threadId()
 91      */
 92     public long getJavaThreadId() {
 93         Long l = getTyped("javaThreadId", Long.class, -1L);
 94         return l.longValue();
 95     }
 96 
 97     /**
 98      * Returns a unique ID for both native threads and Java threads that can't be
 99      * reused within the lifespan of the JVM.
100      * <p>
101      * See {@link #getJavaThreadId()} for the ID that is returned by
102      * {@code java.lang.Thread.threadId()}.
103      * <p>
104      * See {@link #getOSThreadId()} for the ID that is returned by
105      * the operating system.
106      *
107      * @return a unique ID for the thread
108      */
109     public long getId() {
110         return uniqueId;
111     }
112 
113     /**
114      * {@return {@code true} if this is a virtual Thread, {@code false} otherwise}
115      *
116      * @since 19
117      */
118     @PreviewFeature(feature = PreviewFeature.Feature.VIRTUAL_THREADS, reflective = true)
119     public boolean isVirtual() {
120         return getTyped("virtual", Boolean.class, Boolean.FALSE);
121     }
122 
123 }