blob: 869dbe642eb3a8b39c6a1357a62047372e4b01cd [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2003 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-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.
* <p>
* Clients are not intended to implement this interface.
* </p>
* @see org.eclipse.debug.core.model.IThread
*/
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 specfied 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>).
*
* @param evaluation the evalation 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 asyncronously in a seperate 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
* @since 3.0
* @see java.lang.Thread#stop(java.lang.Throwable)
*/
public void stop(IJavaObject exception) throws DebugException;
}