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 
 30 /**
 31  * A recorded thread.
 32  *
 33  * @since 9
 34  */
 35 public final class RecordedThread extends RecordedObject {
 36     private final long uniqueId;
 37 
 38     // package private
 39     RecordedThread(ObjectContext objectContext, long id, Object[] values) {
 40         super(objectContext, values);
 41         this.uniqueId = id;
 42     }
 43 
 44     /**
 45      * Returns the thread name used by the operating system.
 46      *
 47      * @return the OS thread name, or {@code null} if doesn't exist
 48      */
 49     public String getOSName() {
 50         return getTyped("osName", String.class, null);
 51     }
 52 
 53     /**
 54      * Returns the thread ID used by the operating system.
 55      *
 56      * @return the OS thread ID, or {@code -1} if doesn't exist
 57      */
 58     public long getOSThreadId() {
 59         Long l = getTyped("osThreadId", Long.class, -1L);
 60         return l.longValue();
 61     }
 62 
 63     /**
 64      * Returns the Java thread group, if available.
 65      *
 66      * @return the thread group, or {@code null} if doesn't exist
 67      */
 68     public RecordedThreadGroup getThreadGroup() {
 69         return getTyped("group", RecordedThreadGroup.class, null);
 70     }
 71 
 72     /**
 73      * Returns the Java thread name, or {@code null} if doesn't exist.
 74      * <p>
 75      * Returns {@code java.lang.Thread.getName()} if the thread has a Java
 76      * representation. {@code null} otherwise.
 77      *
 78      * @return the Java thread name, or {@code null} if doesn't exist
 79      */
 80     public String getJavaName() {
 81         return getTyped("javaName", String.class, null);
 82     }
 83 
 84     /**
 85      * Returns the Java thread ID, or {@code -1} if it's not a Java thread.
 86      *
 87      * @return the Java thread ID, or {@code -1} if it's not a Java thread
 88      *
 89      * @see java.lang.Thread#threadId()
 90      */
 91     public long getJavaThreadId() {
 92         Long l = getTyped("javaThreadId", Long.class, -1L);
 93         return l.longValue();
 94     }
 95 
 96     /**
 97      * Returns a unique ID for both native threads and Java threads that can't be
 98      * reused within the lifespan of the JVM.
 99      * <p>
100      * See {@link #getJavaThreadId()} for the ID that is returned by
101      * {@code java.lang.Thread.threadId()}.
102      * <p>
103      * See {@link #getOSThreadId()} for the ID that is returned by
104      * the operating system.
105      *
106      * @return a unique ID for the thread
107      */
108     public long getId() {
109         return uniqueId;
110     }
111 
112     /**
113      * {@return {@code true} if this is a virtual Thread, {@code false} otherwise}
114      *
115      * @since 21
116      */
117     public boolean isVirtual() {
118         return getTyped("virtual", Boolean.class, Boolean.FALSE);
119     }
120 
121 }