/* |
|
* Copyright (c) 1998, 2013, 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 |
|
* under the terms of the GNU General Public License version 2 only, as |
|
* published by the Free Software Foundation. Oracle designates this |
|
* particular file as subject to the "Classpath" exception as provided |
|
* by Oracle in the LICENSE file that accompanied this code. |
|
* |
|
* This code is distributed in the hope that it will be useful, but WITHOUT |
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
* version 2 for more details (a copy is included in the LICENSE file that |
|
* accompanied this code). |
|
* |
|
* You should have received a copy of the GNU General Public License version |
|
* 2 along with this work; if not, write to the Free Software Foundation, |
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
|
* |
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
|
* or visit www.oracle.com if you need additional information or have any |
|
* questions. |
|
*/ |
|
package com.sun.jdi; |
|
import java.util.List; |
|
/** |
|
* A thread object from the target VM. |
|
* A ThreadReference is an {@link ObjectReference} with additional |
|
* access to thread-specific information from the target VM. |
|
* |
|
* @author Robert Field |
|
* @author Gordon Hirsch |
|
* @author James McIlree |
|
* @since 1.3 |
|
*/ |
|
@jdk.Exported |
|
public interface ThreadReference extends ObjectReference { |
|
/** Thread status is unknown */ |
|
public final int THREAD_STATUS_UNKNOWN =-1; |
|
/** Thread has completed execution */ |
|
public final int THREAD_STATUS_ZOMBIE = 0; |
|
/** Thread is runnable */ |
|
public final int THREAD_STATUS_RUNNING = 1; |
|
/** Thread is sleeping - Thread.sleep() or JVM_Sleep() was called */ |
|
public final int THREAD_STATUS_SLEEPING = 2; |
|
/** Thread is waiting on a java monitor */ |
|
public final int THREAD_STATUS_MONITOR = 3; |
|
/** Thread is waiting - Object.wait() or JVM_MonitorWait() was called */ |
|
public final int THREAD_STATUS_WAIT = 4; |
|
/** Thread has not yet been started */ |
|
public final int THREAD_STATUS_NOT_STARTED = 5; |
|
/** |
|
* Returns the name of this thread. |
|
* |
|
* @return the string containing the thread name. |
|
*/ |
|
String name(); |
|
/** |
|
* Suspends this thread. The thread can be resumed through |
|
* {@link #resume} or resumed with other threads through |
|
* {@link VirtualMachine#resume}. |
|
* <p> |
|
* Unlike {@link java.lang.Thread#suspend}, |
|
* suspends of both the virtual machine and individual threads are |
|
* counted. Before a thread will run again, it must be resumed |
|
* (through {@link #resume} or {@link ThreadReference#resume}) |
|
* the same number of times it has been suspended. |
|
* <p> |
|
* Suspending single threads with this method has the same dangers |
|
* as {@link java.lang.Thread#suspend()}. If the suspended thread |
|
* holds a monitor needed by another running thread, deadlock is |
|
* possible in the target VM (at least until the suspended thread |
|
* is resumed again). |
|
* <p> |
|
* The suspended thread is guaranteed to remain suspended until |
|
* resumed through one of the JDI resume methods mentioned above; |
|
* the application in the target VM cannot resume the suspended thread |
|
* through {@link java.lang.Thread#resume}. |
|
* @throws VMCannotBeModifiedException if the VirtualMachine is read-only - see {@link VirtualMachine#canBeModified()}. |
|
*/ |
|
void suspend(); |
|
/** |
|
* Resumes this thread. If this thread was not previously suspended |
|
* through {@link #suspend} or through {@link VirtualMachine#suspend}, |
|
* or because of a SUSPEND_ALL or SUSPEND_EVENT_THREAD event, then |
|
* invoking this method has no effect. Otherwise, the count of pending |
|
* suspends on this thread is decremented. If it is decremented to 0, |
|
* the thread will continue to execute. |
|
* Note: the normal way to resume from an event related suspension is |
|
* via {@link com.sun.jdi.event.EventSet#resume}. |
|
* @throws VMCannotBeModifiedException if the VirtualMachine is read-only - see {@link VirtualMachine#canBeModified()}. |
|
*/ |
|
void resume(); |
|
/** |
|
* Returns the number of pending suspends for this thread. See |
|
* {@link #suspend} for an explanation of counted suspends. |
|
* @return pending suspend count as an integer |
|
*/ |
|
int suspendCount(); |
|
/** |
|
* Stops this thread with an asynchronous exception. |
|
* A debugger thread in the target VM will stop this thread |
|
* with the given {@link java.lang.Throwable} object. |
|
* |
|
* @param throwable the asynchronous exception to throw. |
|
* @throws InvalidTypeException if <code>throwable</code> is not |
|
* an instance of java.lang.Throwable in the target VM. |
|
* @throws VMCannotBeModifiedException if the VirtualMachine is read-only - see {@link VirtualMachine#canBeModified()}. |
|
* @see java.lang.Thread#stop(Throwable) |
|
*/ |
|
void stop(ObjectReference throwable) throws InvalidTypeException; |
|
/** |
|
* Interrupts this thread unless the thread has been suspended by the |
|
* debugger. |
|
* @throws VMCannotBeModifiedException if the VirtualMachine is read-only - see {@link VirtualMachine#canBeModified()}. |
|
* |
|
* @see java.lang.Thread#interrupt() |
|
*/ |
|
void interrupt(); |
|
/** |
|
* Returns the thread's status. If the thread is not suspended the |
|
* thread's current status is returned. If the thread is suspended, the |
|
* thread's status before the suspension is returned (or |
|
* {@link #THREAD_STATUS_UNKNOWN} if this information is not available. |
|
* {@link #isSuspended} can be used to determine if the thread has been |
|
* suspended. |
|
* |
|
* @return one of |
|
* {@link #THREAD_STATUS_UNKNOWN}, |
|
* {@link #THREAD_STATUS_ZOMBIE}, |
|
* {@link #THREAD_STATUS_RUNNING}, |
|
* {@link #THREAD_STATUS_SLEEPING}, |
|
* {@link #THREAD_STATUS_MONITOR}, |
|
* {@link #THREAD_STATUS_WAIT}, |
|
* {@link #THREAD_STATUS_NOT_STARTED}, |
|
*/ |
|
int status(); |
|
/** |
|
* Determines whether the thread has been suspended by the |
|
* the debugger. |
|
* |
|
* @return <code>true</code> if the thread is currently suspended; |
|
* <code>false</code> otherwise. |
|
*/ |
|
boolean isSuspended(); |
|
/** |
|
* Determines whether the thread is suspended at a breakpoint. |
|
* |
|
* @return <code>true</code> if the thread is currently stopped at |
|
* a breakpoint; <code>false</code> otherwise. |
|
*/ |
|
boolean isAtBreakpoint(); |
|
/** |
|
* Returns this thread's thread group. |
|
* @return a {@link ThreadGroupReference} that mirrors this thread's |
|
* thread group in the target VM. |
|
*/ |
|
ThreadGroupReference threadGroup(); |
|
/** |
|
* Returns the number of stack frames in the thread's current |
|
* call stack. |
|
* The thread must be suspended (normally through an interruption |
|
* to the VM) to get this information, and |
|
* it is only valid until the thread is resumed again. |
|
* |
|
* @return an integer frame count |
|
* @throws IncompatibleThreadStateException if the thread is |
|
* not suspended in the target VM |
|
*/ |
|
int frameCount() throws IncompatibleThreadStateException; |
|
/** |
|
* Returns a List containing each {@link StackFrame} in the |
|
* thread's current call stack. |
|
* The thread must be suspended (normally through an interruption |
|
* to the VM) to get this information, and |
|
* it is only valid until the thread is resumed again. |
|
* |
|
* @return a List of {@link StackFrame} with the current frame first |
|
* followed by each caller's frame. |
|
* @throws IncompatibleThreadStateException if the thread is |
|
* not suspended in the target VM |
|
*/ |
|
List<StackFrame> frames() throws IncompatibleThreadStateException; |
|
/** |
|
* Returns the {@link StackFrame} at the given index in the |
|
* thread's current call stack. Index 0 retrieves the current |
|
* frame; higher indices retrieve caller frames. |
|
* The thread must be suspended (normally through an interruption |
|
* to the VM) to get this information, and |
|
* it is only valid until the thread is resumed again. |
|
* |
|
* @param index the desired frame |
|
* @return the requested {@link StackFrame} |
|
* @throws IncompatibleThreadStateException if the thread is |
|
* not suspended in the target VM |
|
* @throws java.lang.IndexOutOfBoundsException if the index is greater than |
|
* or equal to {@link #frameCount} or is negative. |
|
*/ |
|
StackFrame frame(int index) throws IncompatibleThreadStateException; |
|
/** |
|
* Returns a List containing a range of {@link StackFrame} mirrors |
|
* from the thread's current call stack. |
|
* The thread must be suspended (normally through an interruption |
|
* to the VM) to get this information, and |
|
* it is only valid until the thread is resumed again. |
|
* |
|
* @param start the index of the first frame to retrieve. |
|
* Index 0 represents the current frame. |
|
* @param length the number of frames to retrieve |
|
* @return a List of {@link StackFrame} with the current frame first |
|
* followed by each caller's frame. |
|
* @throws IncompatibleThreadStateException if the thread is |
|
* not suspended in the target VM |
|
* @throws IndexOutOfBoundsException if the specified range is not |
|
* within the range of stack frame indicies. |
|
* That is, the exception is thrown if any of the following are true: |
|
* <pre> start < 0 |
|
* start >= {@link #frameCount} |
|
* length < 0 |
|
* (start+length) > {@link #frameCount}</pre> |
|
*/ |
|
List<StackFrame> frames(int start, int length) |
|
throws IncompatibleThreadStateException; |
|
/** |
|
* Returns a List containing an {@link ObjectReference} for |
|
* each monitor owned by the thread. |
|
* A monitor is owned by a thread if it has been entered |
|
* (via the synchronized statement or entry into a synchronized |
|
* method) and has not been relinquished through {@link Object#wait}. |
|
* <p> |
|
* Not all target virtual machines support this operation. |
|
* Use {@link VirtualMachine#canGetOwnedMonitorInfo()} |
|
* to determine if the operation is supported. |
|
* |
|
* @return a List of {@link ObjectReference} objects. The list |
|
* has zero length if no monitors are owned by this thread. |
|
* @throws java.lang.UnsupportedOperationException if |
|
* the target virtual machine does not support this |
|
* operation. |
|
* @throws IncompatibleThreadStateException if the thread is |
|
* not suspended in the target VM |
|
*/ |
|
List<ObjectReference> ownedMonitors() |
|
throws IncompatibleThreadStateException; |
|
/** |
|
* Returns a List containing a {@link MonitorInfo} object for |
|
* each monitor owned by the thread. |
|
* A monitor is owned by a thread if it has been entered |
|
* (via the synchronized statement or entry into a synchronized |
|
* method) and has not been relinquished through {@link Object#wait}. |
|
* <p> |
|
* Not all target virtual machines support this operation. |
|
* Use {@link VirtualMachine#canGetMonitorFrameInfo()} |
|
* to determine if the operation is supported. |
|
* |
|
* @return a List of {@link MonitorInfo} objects. The list |
|
* has zero length if no monitors are owned by this thread. |
|
* @throws java.lang.UnsupportedOperationException if |
|
* the target virtual machine does not support this |
|
* operation. |
|
* @throws IncompatibleThreadStateException if the thread is |
|
* not suspended in the target VM |
|
* |
|
* @since 1.6 |
|
*/ |
|
List<MonitorInfo> ownedMonitorsAndFrames() |
|
throws IncompatibleThreadStateException; |
|
/** |
|
* Returns an {@link ObjectReference} for the monitor, if any, |
|
* for which this thread is currently waiting. |
|
* The thread can be waiting for a monitor through entry into a |
|
* synchronized method, the synchronized statement, or |
|
* {@link Object#wait}. The {@link #status} method can be used |
|
* to differentiate between the first two cases and the third. |
|
* <p> |
|
* Not all target virtual machines support this operation. |
|
* Use {@link VirtualMachine#canGetCurrentContendedMonitor()} |
|
* to determine if the operation is supported. |
|
* |
|
* @return the {@link ObjectReference} corresponding to the |
|
* contended monitor, or null if it is not waiting for a monitor. |
|
* @throws java.lang.UnsupportedOperationException if |
|
* the target virtual machine does not support this |
|
* operation. |
|
* @throws IncompatibleThreadStateException if the thread is |
|
* not suspended in the target VM |
|
*/ |
|
ObjectReference currentContendedMonitor() throws IncompatibleThreadStateException; |
|
/** |
|
* Pop stack frames. |
|
* <P> |
|
* All frames up to and including the <CODE>frame</CODE> are |
|
* popped off the stack. |
|
* The frame previous to the parameter <CODE>frame</CODE> |
|
* will become the current frame. |
|
* <P> |
|
* After this operation, this thread will be |
|
* suspended at the invoke instruction of the target method |
|
* that created <CODE>frame</CODE>. |
|
* The <CODE>frame</CODE>'s method can be reentered with a step into |
|
* the instruction. |
|
* <P> |
|
* The operand stack is restored, however, any changes |
|
* to the arguments that occurred in the called method, remain. |
|
* For example, if the method <CODE>foo</CODE>: |
|
* <PRE> |
|
* void foo(int x) { |
|
* System.out.println("Foo: " + x); |
|
* x = 4; |
|
* System.out.println("pop here"); |
|
* } |
|
* </PRE> |
|
* was called with <CODE>foo(7)</CODE> and <CODE>foo</CODE> |
|
* is popped at the second <CODE>println</CODE> and resumed, |
|
* it will print: <CODE>Foo: 4</CODE>. |
|
* <P> |
|
* Locks acquired by a popped frame are released when it |
|
* is popped. This applies to synchronized methods that |
|
* are popped, and to any synchronized blocks within them. |
|
* <P> |
|
* Finally blocks are not executed. |
|
* <P> |
|
* No aspect of state, other than this thread's execution point and |
|
* locks, is affected by this call. Specifically, the values of |
|
* fields are unchanged, as are external resources such as |
|
* I/O streams. Additionally, the target program might be |
|
* placed in a state that is impossible with normal program flow; |
|
* for example, order of lock acquisition might be perturbed. |
|
* Thus the target program may |
|
* proceed differently than the user would expect. |
|
* <P> |
|
* The specified thread must be suspended. |
|
* <P> |
|
* All <code>StackFrame</code> objects for this thread are |
|
* invalidated. |
|
* <P> |
|
* No events are generated by this method. |
|
* <P> |
|
* None of the frames through and including the frame for the caller |
|
* of <i>frame</i> may be native. |
|
* <P> |
|
* Not all target virtual machines support this operation. |
|
* Use {@link VirtualMachine#canPopFrames() VirtualMachine.canPopFrames()} |
|
* to determine if the operation is supported. |
|
* |
|
* @param frame Stack frame to pop. <CODE>frame</CODE> is on this |
|
* thread's call stack. |
|
* |
|
* @throws java.lang.UnsupportedOperationException if |
|
* the target virtual machine does not support this |
|
* operation - see |
|
* {@link VirtualMachine#canPopFrames() VirtualMachine.canPopFrames()}. |
|
* |
|
* @throws IncompatibleThreadStateException if this |
|
* thread is not suspended. |
|
* |
|
* @throws java.lang.IllegalArgumentException if <CODE>frame</CODE> |
|
* is not on this thread's call stack. |
|
* |
|
* @throws NativeMethodException if one of the frames that would be |
|
* popped is that of a native method or if the frame previous to |
|
* <i>frame</i> is native. |
|
* |
|
* @throws InvalidStackFrameException if <CODE>frame</CODE> has become |
|
* invalid. Once this thread is resumed, the stack frame is |
|
* no longer valid. This exception is also thrown if there are no |
|
* more frames. |
|
* @throws VMCannotBeModifiedException if the VirtualMachine is read-only - see {@link VirtualMachine#canBeModified()}. |
|
* |
|
* @since 1.4 */ |
|
void popFrames(StackFrame frame) throws IncompatibleThreadStateException; |
|
/** |
|
* Force a method to return before it reaches a return |
|
* statement. |
|
* <p> |
|
* The method which will return early is referred to as the |
|
* called method. The called method is the current method (as |
|
* defined by the Frames section in the Java Virtual Machine |
|
* Specification) for the specified thread at the time this |
|
* method is called. |
|
* <p> |
|
* The thread must be suspended. |
|
* The return occurs when execution of Java programming |
|
* language code is resumed on this thread. Between the call to |
|
* this method and resumption of thread execution, the |
|
* state of the stack is undefined. |
|
* <p> |
|
* No further instructions are executed in the called |
|
* method. Specifically, finally blocks are not executed. Note: |
|
* this can cause inconsistent states in the application. |
|
* <p> |
|
* A lock acquired by calling the called method (if it is a |
|
* synchronized method) and locks acquired by entering |
|
* synchronized blocks within the called method are |
|
* released. Note: this does not apply to native locks or |
|
* java.util.concurrent.locks locks. |
|
* <p> |
|
* Events, such as MethodExit, are generated as they would be in |
|
* a normal return. |
|
* <p> |
|
* The called method must be a non-native Java programming |
|
* language method. Forcing return on a thread with only one |
|
* frame on the stack causes the thread to exit when resumed. |
|
* <p> |
|
* The <code>value</code> argument is the value that the |
|
* method is to return. |
|
* If the return type of the method is void, then value must |
|
* be a {@link VoidValue VoidValue}. |
|
* Object values must be assignment compatible with the method return type |
|
* (This implies that the method return type must be loaded through the |
|
* enclosing class's class loader). Primitive values must be |
|
* either assignment compatible with the method return type or must be |
|
* convertible to the variable type without loss of information. |
|
* See JLS section 5.2 for more information on assignment |
|
* compatibility. |
|
* <p> |
|
* Not all target virtual machines support this operation. |
|
* Use {@link VirtualMachine#canForceEarlyReturn()} |
|
* to determine if the operation is supported. |
|
* |
|
* @param value the value the method is to return. |
|
* |
|
* @throws java.lang.UnsupportedOperationException if |
|
* the target virtual machine does not support this |
|
* operation - see |
|
* {@link VirtualMachine#canGetInstanceInfo() canForceEarlyReturn()} |
|
* |
|
* @throws IncompatibleThreadStateException if this |
|
* thread is not suspended. |
|
* |
|
* @throws NativeMethodException if the frame to be returned from |
|
* is that of a native method. |
|
* |
|
* @throws InvalidStackFrameException if there are no frames. |
|
* |
|
* @throws InvalidTypeException if the value's type does not match |
|
* the method's return type. |
|
* |
|
* @throws ClassNotLoadedException if the method's return type has not yet |
|
* been loaded through the appropriate class loader. |
|
* |
|
* @throws VMCannotBeModifiedException if the VirtualMachine is read-only - see {@link VirtualMachine#canBeModified()}. |
|
* |
|
* @since 1.6 |
|
*/ |
|
void forceEarlyReturn(Value value) throws InvalidTypeException, |
|
ClassNotLoadedException, |
|
IncompatibleThreadStateException; |
|
} |