/******************************************************************************* * Copyright (c) 2000, 2011 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.jdt.debug.core; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.debug.core.DebugException; import org.eclipse.debug.core.model.IFilteredStep; import org.eclipse.debug.core.model.IThread; /** * A thread in a Java virtual machine. * * @see org.eclipse.debug.core.model.IThread * @noimplement This interface is not intended to be implemented by clients. * @noextend This interface is not intended to be extended by clients. */ @SuppressWarnings("deprecation") public interface IJavaThread extends IThread, IFilteredStep { /** * Status code indicating a request failed because a thread was not * suspended. */ public static final int ERR_THREAD_NOT_SUSPENDED = 100; /** * Status code indicating a request to perform a message send failed because * a thread was already performing a message send. * * @see IJavaObject#sendMessage(String, String, IJavaValue[], IJavaThread, * boolean) * @see IJavaClassType#sendMessage(String, String, IJavaValue[], * IJavaThread) * @see IJavaClassType#newInstance(String, IJavaValue[], IJavaThread) */ public static final int ERR_NESTED_METHOD_INVOCATION = 101; /** * Status code indicating a request to perform a message send failed because * a thread was not suspended by a step or breakpoint event. When a thread * is suspended explicitly via the <code>suspend()</code> method, it is not * able to perform method invocations (this is a JDI limitation). * * @see IJavaObject#sendMessage(String, String, IJavaValue[], IJavaThread, * boolean) * @see IJavaClassType#sendMessage(String, String, IJavaValue[], * IJavaThread) * @see IJavaClassType#newInstance(String, IJavaValue[], IJavaThread) */ public static final int ERR_INCOMPATIBLE_THREAD_STATE = 102; /** * Returns whether this thread is a system thread. * * @return whether this thread is a system thread * @exception DebugException * if this method fails. Reasons include: * <ul> * <li>Failure communicating with the VM. The * DebugException's status code contains the underlying * exception responsible for the failure.</li> * </ul> */ boolean isSystemThread() throws DebugException; /** * Returns whether any of the stack frames associated with this thread are * running code in the VM that is out of synch with the code in the * workspace. * * @return whether this thread is out of synch with the workspace. * @exception DebugException * if this method fails. Reasons include: * <ul> * <li>Failure communicating with the VM. The * DebugException's status code contains the underlying * exception responsible for the failure.</li> * @since 2.0 */ boolean isOutOfSynch() throws DebugException; /** * Returns whether this thread may be running code in the VM that is out of * synch with the code in the workspace. * * @return whether this thread may be out of synch with the workspace. * @exception DebugException * if this method fails. Reasons include: * <ul> * <li>Failure communicating with the VM. The * DebugException's status code contains the underlying * exception responsible for the failure.</li> * @since 2.0 */ boolean mayBeOutOfSynch() throws DebugException; /** * Returns whether this thread is currently performing an evaluation. * * @return whether this thread is currently performing an evaluation * @since 2.0 */ boolean isPerformingEvaluation(); /** * Returns the name of the thread group this thread belongs to, or * <code>null</code> if none. * * @return thread group name, or <code>null</code> if none * @exception DebugException * if this method fails. Reasons include: * <ul> * <li>Failure communicating with the VM. The * DebugException's status code contains the underlying * exception responsible for the failure.</li> * </ul> */ String getThreadGroupName() throws DebugException; /** * Returns a variable with the given name, or <code>null</code> if unable to * resolve a variable with the name, or if this thread is not currently * suspended. * <p> * Variable lookup works only when a thread is suspended. Lookup is * performed in all stack frames, in a top-down order, returning the first * successful match, or <code>null</code> if no match is found. * </p> * * @param variableName * the name of the variable to search for * @return a variable, or <code>null</code> if none * @exception DebugException * if this method fails. Reasons include: * <ul> * <li>Failure communicating with the VM. The * DebugException's status code contains the underlying * exception responsible for the failure.</li> * </ul> */ IJavaVariable findVariable(String variableName) throws DebugException; /** * Invokes the given evaluation with the specified progress monitor. This * thread fires a resume event when the evaluation begins, and a suspend * event when the evaluation completes or throws an exception. The events * are given a detail as specified by <code>evaluationDetail</code> (one of * <code>DebugEvent.EVALUATION</code> or * <code>DebugEvent.EVALUATION_IMPLICIT</code>). * <p> * Since 3.5, the <code>org.eclipse.jdt.debug.breakpointListeners</code> * extension point supports evaluation execution during a listener call * back. Suspend and resume events are not fired during listener call backs. * Unspecified model specific events are fired. * </p> * * @param evaluation * the evaluation to perform * @param monitor * progress monitor (may be <code>null</code> * @param evaluationDetail * one of <code>DebugEvent.EVALUATION</code> or * <code>DebugEvent.EVALUATION_IMPLICIT</code> * @param hitBreakpoints * whether or not breakpoints should be honored in this thread * during the evaluation. If <code>false</code>, breakpoints hit * in this thread during the evaluation will be ignored. * @exception DebugException * if an exception occurs performing the evaluation * @since 2.0 */ public void runEvaluation(IEvaluationRunnable evaluation, IProgressMonitor monitor, int evaluationDetail, boolean hitBreakpoints) throws DebugException; /** * Queues the given runnable with the list of runnables associated with this * thread. Runnables are executed asynchronously in a separate thread. This * method should be used to execute any code which performs an operation * like a method invocation. * * @param runnable * the runnable to execute. * @since 2.1 */ public void queueRunnable(Runnable runnable); /** * Attempts to terminate the currently executing * <code>IEvaluationRunnable</code> in this thread, if any. * * Evaluations may be composed of a series of instructions. Terminating an * evaluation means stopping the evaluation after the current instruction * completes. A single instruction (such as a method invocation) cannot be * interrupted. * * @exception DebugException * if an exception occurs while terminating the evaluation. * @since 2.1 */ public void terminateEvaluation() throws DebugException; /** * Returns whether the currently executing <code>IEvaluationRunnable</code> * supports termination. An IEvaluationRunnable supports termination if it * implements <code>ITerminate</code> * * @return whether the current evaluation supports termination * @since 2.1 */ public boolean canTerminateEvaluation(); /** * Returns a Java object for the monitor for which this thread is currently * waiting or <code>null</code>. * * @return IJavaObject the contended monitor object or <code>null</code> if * this thread is not waiting on a monitor. * @exception DebugException * if an exception occurs while retrieving the contended * monitor. * @since 2.1 */ public IJavaObject getContendedMonitor() throws DebugException; /** * Returns the monitors owned by this thread or <code>null</code> if this * thread owns no monitors. * * @return the owned monitors * @exception DebugException * if an exception occurs while retrieving the owned monitors * of this thread. * @since 2.1 */ public IJavaObject[] getOwnedMonitors() throws DebugException; /** * Returns whether this threads owns at least one monitor. * * @return boolean whether this thread owns a monitor * @exception DebugException * if an exception occurs determining if there are owned * monitors. * @since 2.1 */ public boolean hasOwnedMonitors() throws DebugException; /** * Request to stops this thread with the given exception.<br> * The result will be the same as calling * java.lang.Thread#stop(java.lang.Throwable).<br> * If the thread is suspended when the method is called, the thread must be * resumed to complete the action.<br> * * <em>exception</em> must represent an exception. * * @param exception * the exception to throw. * @exception DebugException * if the request fails * @since 3.0 * @see java.lang.Thread#stop(java.lang.Throwable) */ public void stop(IJavaObject exception) throws DebugException; /** * Returns the thread group this thread belongs to or <code>null</code> if * none. * * @return thread group or <code>null</code> * @throws DebugException * if the thread group cannot be computed * @since 3.2 */ public IJavaThreadGroup getThreadGroup() throws DebugException; /** * Returns whether this thread is a daemon thread. * * @return whether this thread is a daemon thread * @throws DebugException * if an exception occurs while determining status * @since 3.3 */ public boolean isDaemon() throws DebugException; /** * Returns the number of frames in this thread. * * @return number of stack frames * @throws DebugException * if an exception occurs while retrieving the count * @since 3.3 */ public int getFrameCount() throws DebugException; /** * Returns the object reference associated with this thread. * * @return thread object reference * @throws DebugException * if unable to retrieve an object reference * @since 3.6 */ public IJavaObject getThreadObject() throws DebugException; }