Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CThread.java')
-rw-r--r--debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CThread.java1101
1 files changed, 0 insertions, 1101 deletions
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CThread.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CThread.java
deleted file mode 100644
index 726c3bfeddd..00000000000
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CThread.java
+++ /dev/null
@@ -1,1101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2015 QNX Software Systems 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:
- * QNX Software Systems - Initial API and implementation
- * Stefan Bylund (Enea, steby@enea.se) - patch for bug 155464
- * Ken Ryall (Nokia) - Support for breakpoint actions (bug 118308)
- * Ling Wang (Nokia) - Bug 176077
- * Denis Pilat (ST) - Bug 205017
- *******************************************************************************/
-package org.eclipse.cdt.debug.internal.core.model;
-
-import com.ibm.icu.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.cdt.debug.core.CDebugCorePlugin;
-import org.eclipse.cdt.debug.core.cdi.CDIException;
-import org.eclipse.cdt.debug.core.cdi.ICDIBreakpointHit;
-import org.eclipse.cdt.debug.core.cdi.ICDIEndSteppingRange;
-import org.eclipse.cdt.debug.core.cdi.ICDILocation;
-import org.eclipse.cdt.debug.core.cdi.ICDISessionObject;
-import org.eclipse.cdt.debug.core.cdi.ICDISignalReceived;
-import org.eclipse.cdt.debug.core.cdi.ICDIWatchpointTrigger;
-import org.eclipse.cdt.debug.core.cdi.event.ICDIChangedEvent;
-import org.eclipse.cdt.debug.core.cdi.event.ICDIDestroyedEvent;
-import org.eclipse.cdt.debug.core.cdi.event.ICDIDisconnectedEvent;
-import org.eclipse.cdt.debug.core.cdi.event.ICDIEvent;
-import org.eclipse.cdt.debug.core.cdi.event.ICDIEventListener;
-import org.eclipse.cdt.debug.core.cdi.event.ICDIResumedEvent;
-import org.eclipse.cdt.debug.core.cdi.event.ICDISuspendedEvent;
-import org.eclipse.cdt.debug.core.cdi.model.ICDIDisposable;
-import org.eclipse.cdt.debug.core.cdi.model.ICDIObject;
-import org.eclipse.cdt.debug.core.cdi.model.ICDIStackFrame;
-import org.eclipse.cdt.debug.core.cdi.model.ICDITargetConfiguration;
-import org.eclipse.cdt.debug.core.cdi.model.ICDITargetConfiguration2;
-import org.eclipse.cdt.debug.core.cdi.model.ICDIThread;
-import org.eclipse.cdt.debug.core.model.CDebugElementState;
-import org.eclipse.cdt.debug.core.model.ICDebugElementStatus;
-import org.eclipse.cdt.debug.core.model.ICStackFrame;
-import org.eclipse.cdt.debug.core.model.ICThread;
-import org.eclipse.cdt.debug.core.model.IDummyStackFrame;
-import org.eclipse.cdt.debug.core.model.IMoveToAddress;
-import org.eclipse.cdt.debug.core.model.IMoveToLine;
-import org.eclipse.cdt.debug.core.model.IRestart;
-import org.eclipse.cdt.debug.core.model.IResumeAtAddress;
-import org.eclipse.cdt.debug.core.model.IResumeAtLine;
-import org.eclipse.cdt.debug.core.model.IResumeWithoutSignal;
-import org.eclipse.cdt.debug.core.model.IRunToAddress;
-import org.eclipse.cdt.debug.core.model.IRunToLine;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.debug.core.DebugEvent;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.debug.core.model.IMemoryBlockRetrieval;
-import org.eclipse.debug.core.model.IStackFrame;
-
-/**
- * A thread in a C/C++ debug model.
- */
-public class CThread extends CDebugElement implements ICThread, IRestart, IResumeWithoutSignal, ICDIEventListener {
-
- private final static int MAX_STACK_DEPTH = 100;
-
- /**
- * Underlying CDI thread.
- */
- private ICDIThread fCDIThread;
-
- /**
- * Collection of stack frames
- */
- private ArrayList fStackFrames;
-
- /**
- * Whether children need to be refreshed. Set to <code>true</code> when stack frames are re-used on the next suspend.
- */
- private boolean fRefreshChildren = true;
-
- /**
- * The debug configuration of this session.
- */
- private ICDITargetConfiguration fConfig;
-
- /**
- * Whether this thread is current.
- */
- private boolean fIsCurrent = false;
-
- /**
- * The depth of the current stack.
- */
- private int fLastStackDepth = 0;
-
- /**
- * Whether this thread is disposed.
- */
- private boolean fDisposed = false;
-
- /**
- * Constructor for CThread.
- */
- public CThread( CDebugTarget target, ICDIThread cdiThread ) {
- super( target );
- setState( cdiThread.isSuspended() ? CDebugElementState.SUSPENDED : CDebugElementState.RESUMED );
- setCDIThread( cdiThread );
- fConfig = getCDITarget().getConfiguration();
- initialize();
- getCDISession().getEventManager().addEventListener( this );
- }
-
- protected void initialize() {
- fStackFrames = new ArrayList();
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.debug.core.model.IThread#getStackFrames()
- */
- @Override
- public IStackFrame[] getStackFrames() throws DebugException {
- List list = Collections.EMPTY_LIST;
- try {
- list = computeStackFrames();
- }
- catch( DebugException e ) {
- setStatus( ICDebugElementStatus.ERROR, e.getStatus().getMessage() );
- throw e;
- }
- return (IStackFrame[])list.toArray( new IStackFrame[list.size()] );
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.debug.core.model.IThread#hasStackFrames()
- */
- @Override
- public boolean hasStackFrames() throws DebugException {
- // Always return true to postpone the stack frames request.
- // But not if the thread is already resumed. This fixes flickering in the Debug View.
- if (getState().equals( CDebugElementState.RESUMED ))
- return false;
-
- return true;
- }
-
- /**
- * @see computeStackFrames()
- *
- * @param refreshChildren whether or not this method should request new stack frames from the target
- */
- protected synchronized List computeStackFrames( boolean refreshChildren ) throws DebugException {
- if ( isSuspended() ) {
- if ( isTerminated() ) {
- fStackFrames = new ArrayList();
- }
- else if ( refreshChildren ) {
- // Remove dummy frame
- if ( fStackFrames.size() > 0 ) {
- Object frame = fStackFrames.get( fStackFrames.size() - 1 );
- if ( frame instanceof IDummyStackFrame ) {
- fStackFrames.remove( frame );
- }
- }
- // Retrieve stack frames from the backend
- int depth = getStackDepth();
- if ( depth >= getMaxStackDepth() )
- depth = getMaxStackDepth() - 1;
- ICDIStackFrame[] frames = ( depth != 0 ) ? getCDIStackFrames( 0, depth - 1 ) : new ICDIStackFrame[0];
-
- // Safety precaution in case getting the stack frames failed to get us as many as it said
- depth = frames.length;
-
- if ( fStackFrames.isEmpty() ) {
- if ( frames.length > 0 ) {
- addStackFrames( frames, 0, frames.length, false );
- }
- }
- else {
- int diff = depth - getLastStackDepth();
- int offset = ( diff > 0 ) ? frames.length - diff : 0;
- int length = ( diff > 0 ) ? diff : -diff;
- if (offset < 0 || !compareStackFrames( frames, fStackFrames, offset, length ) ) {
- // replace all frames
- disposeStackFrames( 0, fStackFrames.size() );
- addStackFrames( frames, 0, frames.length, false );
- }
- if ( diff < 0 ) {
- // stepping out of the last frame
- disposeStackFrames( 0, getLastStackDepth() - depth );
- if ( frames.length > 0 ) {
- updateStackFrames( frames, 0, fStackFrames, fStackFrames.size() );
- if ( fStackFrames.size() < frames.length ) {
- addStackFrames( frames, fStackFrames.size(), frames.length - fStackFrames.size(), true );
- }
- }
- }
- else if ( diff > 0 ) {
- // stepping into a new frame
- disposeStackFrames( frames.length - depth + getLastStackDepth(), depth - getLastStackDepth() );
- addStackFrames( frames, 0, depth - getLastStackDepth(), false );
- updateStackFrames( frames, depth - getLastStackDepth(), fStackFrames, frames.length - depth + getLastStackDepth() );
- }
- else { // diff == 0
- if ( depth != 0 ) {
- // we are in the same frame
- updateStackFrames( frames, 0, fStackFrames, frames.length );
- }
- }
- }
- if ( depth > getMaxStackDepth() ) {
- fStackFrames.add( new CDummyStackFrame( this ) );
- }
- setLastStackDepth( depth );
- setRefreshChildren( false );
- }
- }
- return fStackFrames;
- }
-
- /**
- * Compares the lists of the old and new frames.
- *
- * @param newFrames the array of the new frames
- * @param oldFrames the list of the old frames
- * @param offset the offset in the new frames array
- * @param length the number of frames to compare
- *
- * @return <code>true</code> if all frames are same
- */
- private boolean compareStackFrames( ICDIStackFrame[] newFrames, List oldFrames, int offset, int length ) {
- if (offset<0) return false;
- int index = offset;
- Iterator it = oldFrames.iterator();
- while( it.hasNext() && index < newFrames.length ) {
- CStackFrame frame = (CStackFrame)it.next();
- if ( !frame.getCDIStackFrame().equals( newFrames[index++] ) )
- return false;
- }
- return true;
- }
-
- /**
- * Retrieves and returns all underlying stack frames
- *
- * @return list of <code>StackFrame</code>
- * @exception DebugException if this method fails. Reasons include:
- * <ul>
- * </ul>
- */
- protected ICDIStackFrame[] getCDIStackFrames() throws DebugException {
- return new ICDIStackFrame[0];
- }
-
- /**
- * Retrieves and returns underlying stack frames between <code>lowFrame<code/>
- * and <code>highFrame<code/>.
- *
- * @return list of <code>StackFrame</code>
- * @exception DebugException if this method fails. Reasons include:
- * <ul>
- * </ul>
- */
- protected ICDIStackFrame[] getCDIStackFrames( int lowFrame, int highFrame ) throws DebugException {
- try {
- final ICDIThread cdiThread = getCDIThread();
- if (cdiThread != null) {
- return cdiThread.getStackFrames( lowFrame, highFrame );
- }
- }
- catch( CDIException e ) {
- setStatus( ICDebugElementStatus.WARNING, MessageFormat.format( CoreModelMessages.getString( "CThread.0" ), new String[]{ e.getMessage() } ) ); //$NON-NLS-1$
- targetRequestFailed( e.getMessage(), null );
- }
- return new ICDIStackFrame[0];
- }
-
- /**
- * Replaces the underlying stack frame objects in the preserved frames list with the current underlying stack frames.
- *
- * @param newFrames list of current underlying <code>ICDIStackFrame</code>s. Frames from this list are assigned to the underlying frames in the
- * <code>oldFrames</code> list.
- * @param offset the offset in the lists at which to start replacing the old underlying frames
- * @param oldFrames list of preserved frames, of type <code>CStackFrame</code>
- * @param length the number of frames to replace
- */
- protected void updateStackFrames( ICDIStackFrame[] newFrames, int offset, List oldFrames, int length ) throws DebugException {
- for( int i = 0; i < length; i++ ) {
- CStackFrame frame = (CStackFrame)oldFrames.get( offset );
- frame.setCDIStackFrame( newFrames[offset] );
- offset++;
- }
- }
-
- protected void addStackFrames( ICDIStackFrame[] newFrames, int startIndex, int length, boolean append ) {
- if ( newFrames.length >= startIndex + length ) {
- for( int i = 0; i < length; ++i ) {
- if ( append )
- fStackFrames.add( new CStackFrame( this, newFrames[startIndex + i] ) );
- else
- fStackFrames.add( i, new CStackFrame( this, newFrames[startIndex + i] ) );
- }
- }
- }
-
- /**
- * Returns this thread's current stack frames as a list, computing them if required. Returns an empty collection if this thread is not currently suspended,
- * or this thread is terminated. This method should be used internally to get the current stack frames, instead of calling <code>#getStackFrames()</code>,
- * which makes a copy of the current list.
- * <p>
- * Before a thread is resumed a call must be made to one of:
- * <ul>
- * <li><code>preserveStackFrames()</code></li>
- * <li><code>disposeStackFrames()</code></li>
- * </ul>
- * If stack frames are disposed before a thread is resumed, stack frames are completely re-computed on the next call to this method. If stack frames are to
- * be preserved, this method will attempt to re-use any stack frame objects which represent the same stack frame as on the previous suspend. Stack frames
- * are cached until a subsequent call to preserve or dispose stack frames.
- * </p>
- *
- * @return list of <code>IStackFrame</code>
- * @exception DebugException if this method fails. Reasons include:
- * <ul>
- * </ul>
- */
- public synchronized List computeStackFrames() throws DebugException {
- return computeStackFrames( refreshChildren() );
- }
-
- /**
- * @see CThread#computeStackFrames()
- *
- * This method differs from computeStackFrames() in that it always requests new stack frames from the target. As this is an expensive operation, this method
- * should only be used by clients who know for certain that the stack frames on the target have changed.
- */
- public List computeNewStackFrames() throws DebugException {
- return computeStackFrames( true );
- }
-
- /**
- * Helper method for <code>#computeStackFrames()</code> to create all underlying stack frames.
- *
- * @exception DebugException if this method fails. Reasons include:
- * <ul>
- * </ul>
- */
- protected List createAllStackFrames( int depth, ICDIStackFrame[] frames ) throws DebugException {
- List list = new ArrayList( frames.length );
- for( int i = 0; i < frames.length; ++i ) {
- list.add( new CStackFrame( this, frames[i] ) );
- }
- if ( depth > frames.length ) {
- list.add( new CDummyStackFrame( this ) );
- }
- return list;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.debug.core.model.IThread#getPriority()
- */
- @Override
- public int getPriority() throws DebugException {
- return 0;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.debug.core.model.IThread#getTopStackFrame()
- */
- @Override
- public IStackFrame getTopStackFrame() throws DebugException {
- List c = computeStackFrames();
- return (c.isEmpty()) ? null : (IStackFrame)c.get( 0 );
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.debug.core.model.IThread#getName()
- */
- @Override
- public String getName() throws DebugException {
- final ICDIThread cdiThread = getCDIThread();
- return cdiThread != null ? cdiThread.toString() : ""; //$NON-NLS-1$
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.debug.core.model.IThread#getBreakpoints()
- */
- @Override
- public IBreakpoint[] getBreakpoints() {
- List list = new ArrayList( 1 );
- if ( isSuspended() ) {
- IBreakpoint bkpt = null;
- if ( getCurrentStateInfo() instanceof ICDIBreakpointHit )
- bkpt = ((CDebugTarget)getDebugTarget()).getBreakpointManager().getBreakpoint( ((ICDIBreakpointHit)getCurrentStateInfo()).getBreakpoint() );
- else if ( getCurrentStateInfo() instanceof ICDIWatchpointTrigger )
- bkpt = ((CDebugTarget)getDebugTarget()).getBreakpointManager().getBreakpoint( ((ICDIWatchpointTrigger)getCurrentStateInfo()).getWatchpoint() );
- if ( bkpt != null )
- list.add( bkpt );
- }
- return (IBreakpoint[])list.toArray( new IBreakpoint[list.size()] );
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.core.cdi.event.ICDIEventListener#handleDebugEvents(org.eclipse.cdt.debug.core.cdi.event.ICDIEvent[])
- */
- @Override
- public void handleDebugEvents( ICDIEvent[] events ) {
- if ( isDisposed() )
- return;
- for( int i = 0; i < events.length; i++ ) {
- ICDIEvent event = events[i];
- ICDIObject source = event.getSource();
- final ICDIThread cdiThread = getCDIThread();
- if ( source instanceof ICDIThread && cdiThread != null && source.equals( cdiThread ) ) {
- if ( event instanceof ICDISuspendedEvent ) {
- handleSuspendedEvent( (ICDISuspendedEvent)event );
- }
- else if ( event instanceof ICDIResumedEvent ) {
- handleResumedEvent( (ICDIResumedEvent)event );
- }
- else if ( event instanceof ICDIDestroyedEvent ) {
- handleTerminatedEvent( (ICDIDestroyedEvent)event );
- }
- else if ( event instanceof ICDIDisconnectedEvent ) {
- handleDisconnectedEvent( (ICDIDisconnectedEvent)event );
- }
- else if ( event instanceof ICDIChangedEvent ) {
- handleChangedEvent( (ICDIChangedEvent)event );
- }
- }
- }
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.debug.core.model.ISuspendResume#canResume()
- */
- @Override
- public boolean canResume() {
- return ( fConfig.supportsResume() && isSuspended() );
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.core.model.IRunToLine#canRunToLine(org.eclipse.core.resources.IFile, int)
- */
- @Override
- public boolean canRunToLine( IFile file, int lineNumber ) {
- return canRunToLine( file.getLocation().lastSegment(), lineNumber );
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.core.model.IRunToLine#canRunToLine(java.lang.String, int)
- */
- @Override
- public boolean canRunToLine( String fileName, int lineNumber ) {
- return canResume();
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.debug.core.model.ISuspendResume#canSuspend()
- */
- @Override
- public boolean canSuspend() {
- CDebugElementState state = getState();
- return ( fConfig.supportsSuspend() && (state.equals( CDebugElementState.RESUMED ) || state.equals( CDebugElementState.STEPPED )) );
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.debug.core.model.ISuspendResume#isSuspended()
- */
- @Override
- public boolean isSuspended() {
- return getState().equals( CDebugElementState.SUSPENDED );
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.debug.core.model.ISuspendResume#resume()
- */
- @Override
- public void resume() throws DebugException {
- if ( !canResume() )
- return;
- CDebugElementState oldState = getState();
- setState( CDebugElementState.RESUMING );
- try {
- final ICDIThread cdiThread = getCDIThread();
- if (cdiThread != null) {
- cdiThread.resume( false );
- }
- }
- catch( CDIException e ) {
- setState( oldState );
- targetRequestFailed( e.getMessage(), null );
- }
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.core.model.IRunToLine#runToLine(org.eclipse.core.resources.IFile, int, boolean)
- */
- @Override
- public void runToLine( IFile file, int lineNumber, boolean skipBreakpoints ) throws DebugException {
- runToLine( file.getLocation().lastSegment(), lineNumber, skipBreakpoints );
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.core.model.IRunToLine#runToLine(java.lang.String, int, boolean)
- */
- @Override
- public void runToLine( String fileName, int lineNumber, boolean skipBreakpoints ) throws DebugException {
- if ( !canRunToLine( fileName, lineNumber ) )
- return;
- if ( skipBreakpoints ) {
- ((CDebugTarget)getDebugTarget()).skipBreakpoints( true );
- }
- CDebugElementState oldState = getState();
- setState( CDebugElementState.RESUMING );
- ICDILocation location = getCDITarget().createLineLocation( fileName, lineNumber );
-
- try {
- final ICDIThread cdiThread = getCDIThread();
- if (cdiThread != null) {
- cdiThread.stepUntil( location );
- }
- }
- catch( CDIException e ) {
- setState( oldState );
- if ( skipBreakpoints ) {
- ((CDebugTarget)getDebugTarget()).skipBreakpoints( false );
- }
- targetRequestFailed( e.getMessage(), e );
- }
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.debug.core.model.ISuspendResume#suspend()
- */
- @Override
- public void suspend() throws DebugException {
- if ( !canSuspend() )
- return;
- CDebugElementState oldState = getState();
- setState( CDebugElementState.SUSPENDING );
- try {
- final ICDIThread cdiThread = getCDIThread();
- if (cdiThread != null) {
- cdiThread.suspend();
- }
- }
- catch( CDIException e ) {
- setState( oldState );
- targetRequestFailed( e.getMessage(), null );
- }
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.debug.core.model.IStep#canStepInto()
- */
- @Override
- public boolean canStepInto() {
- return canStep();
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.debug.core.model.IStep#canStepOver()
- */
- @Override
- public boolean canStepOver() {
- return canStep();
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.debug.core.model.IStep#canStepReturn()
- */
- @Override
- public boolean canStepReturn() {
- if ( !fConfig.supportsStepping() || !canResume() ) {
- return false;
- }
- return ( fStackFrames.size() > 1 );
- }
-
- /**
- * Returns whether this thread is in a valid state to step.
- *
- * @return whether this thread is in a valid state to step
- */
- protected boolean canStep() {
- if ( !fConfig.supportsStepping() || !isSuspended() ) {
- return false;
- }
- return !fStackFrames.isEmpty();
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.debug.core.model.IStep#isStepping()
- */
- @Override
- public boolean isStepping() {
- return ( getState().equals( CDebugElementState.STEPPING ) ) || ( getState().equals( CDebugElementState.STEPPED ) );
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.debug.core.model.IStep#stepInto()
- */
- @Override
- public void stepInto() throws DebugException {
- if ( !canStepInto() )
- return;
- CDebugElementState oldState = getState();
- setState( CDebugElementState.STEPPING );
- try {
- final ICDIThread cdiThread = getCDIThread();
- if (cdiThread != null) {
- if ( !isInstructionsteppingEnabled() ) {
- cdiThread.stepInto( 1 );
- }
- else {
- cdiThread.stepIntoInstruction( 1 );
- }
- }
- }
- catch( CDIException e ) {
- setState( oldState );
- targetRequestFailed( e.getMessage(), null );
- }
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.debug.core.model.IStep#stepOver()
- */
- @Override
- public void stepOver() throws DebugException {
- if ( !canStepOver() )
- return;
- CDebugElementState oldState = getState();
- setState( CDebugElementState.STEPPING );
- try {
- final ICDIThread cdiThread = getCDIThread();
- if (cdiThread != null) {
- if ( !isInstructionsteppingEnabled() ) {
- cdiThread.stepOver( 1 );
- }
- else {
- cdiThread.stepOverInstruction( 1 );
- }
- }
- }
- catch( CDIException e ) {
- setState( oldState );
- targetRequestFailed( e.getMessage(), null );
- }
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.debug.core.model.IStep#stepReturn()
- */
- @Override
- public void stepReturn() throws DebugException {
- if ( !canStepReturn() )
- return;
- IStackFrame[] frames = getStackFrames();
- if ( frames.length == 0 )
- return;
- CStackFrame f = (CStackFrame)frames[0];
- CDebugElementState oldState = getState();
- setState( CDebugElementState.STEPPING );
- try {
- f.doStepReturn();
- }
- catch( DebugException e ) {
- setState( oldState );
- throw e;
- }
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.debug.core.model.ITerminate#canTerminate()
- */
- @Override
- public boolean canTerminate() {
- return getDebugTarget().canTerminate();
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.debug.core.model.ITerminate#isTerminated()
- */
- @Override
- public boolean isTerminated() {
- return getDebugTarget().isTerminated();
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.debug.core.model.ITerminate#terminate()
- */
- @Override
- public void terminate() throws DebugException {
- getDebugTarget().terminate();
- }
-
- /**
- * Sets the underlying CDI thread that this model object is a proxy to.
- *
- * @param thread the underlying CDI thread
- */
- protected void setCDIThread( ICDIThread cdiThread ) {
- fCDIThread = cdiThread;
- }
-
- /**
- * Returns the underlying CDI thread that this model object is a proxy to.
- *
- * @return the underlying CDI thread
- */
- protected ICDIThread getCDIThread() {
- return fCDIThread;
- }
-
- /**
- * Preserves stack frames to be used on the next suspend event. Iterates through all current stack frames, setting their state as invalid. This method
- * should be called before this thread is resumed, when stack frames are to be re-used when it later suspends.
- *
- * @see computeStackFrames()
- */
- protected synchronized void preserveStackFrames() {
- Iterator it = fStackFrames.iterator();
- while( it.hasNext() ) {
- CStackFrame frame = (((IAdaptable)it.next()).getAdapter( CStackFrame.class ));
- if ( frame != null ) {
- frame.preserve();
- }
- }
- setRefreshChildren( true );
- }
-
- /**
- * Disposes stack frames, to be completely re-computed on the next suspend event. This method should be called before this thread is resumed when stack
- * frames are not to be re-used on the next suspend.
- */
- protected synchronized void disposeStackFrames() {
- Iterator it = fStackFrames.iterator();
- while( it.hasNext() ) {
- Object obj = it.next();
- if ( obj instanceof CStackFrame ) {
- ((CStackFrame)obj).dispose();
- }
- }
- fStackFrames.clear();
- setLastStackDepth( 0 );
- resetStatus();
- setRefreshChildren( true );
- }
-
- protected void disposeStackFrames( int index, int length ) {
- List removeList = new ArrayList( length );
- Iterator it = fStackFrames.iterator();
- int counter = 0;
- while( it.hasNext() ) {
- CStackFrame frame = (((IAdaptable)it.next()).getAdapter( CStackFrame.class ));
- if ( frame != null && counter >= index && counter < index + length ) {
- frame.dispose();
- removeList.add( frame );
- }
- ++counter;
- }
- fStackFrames.removeAll( removeList );
- }
-
- /**
- * Notification this thread has terminated - update state and fire a terminate event.
- */
- protected void terminated() {
- setState( CDebugElementState.TERMINATED );
- dispose();
- }
-
- private void handleSuspendedEvent( ICDISuspendedEvent event ) {
- if ( !(getState().equals( CDebugElementState.RESUMED ) ||
- getState().equals( CDebugElementState.STEPPED ) ||
- getState().equals( CDebugElementState.SUSPENDING )) )
- return;
- setState( CDebugElementState.SUSPENDED );
- ICDISessionObject reason = event.getReason();
- setCurrentStateInfo( reason );
- if ( reason instanceof ICDIEndSteppingRange ) {
- handleEndSteppingRange( (ICDIEndSteppingRange)reason );
- }
- else if ( reason instanceof ICDIBreakpointHit ) {
- handleBreakpointHit( (ICDIBreakpointHit)reason );
- }
- else if ( reason instanceof ICDISignalReceived ) {
- handleSuspendedBySignal( (ICDISignalReceived)reason );
- }
- else {
- // fireSuspendEvent( DebugEvent.CLIENT_REQUEST );
- // Temporary fix for bug 56520
- fireSuspendEvent( DebugEvent.BREAKPOINT );
- }
- }
-
- private void handleResumedEvent( ICDIResumedEvent event ) {
- CDebugElementState state = CDebugElementState.RESUMED;
- int detail = DebugEvent.RESUME;
- syncWithBackend();
- if ( isCurrent() && event.getType() != ICDIResumedEvent.CONTINUE ) {
- preserveStackFrames();
- switch( event.getType() ) {
- case ICDIResumedEvent.STEP_INTO:
- case ICDIResumedEvent.STEP_INTO_INSTRUCTION:
- detail = DebugEvent.STEP_INTO;
- break;
- case ICDIResumedEvent.STEP_OVER:
- case ICDIResumedEvent.STEP_OVER_INSTRUCTION:
- detail = DebugEvent.STEP_OVER;
- break;
- case ICDIResumedEvent.STEP_RETURN:
- detail = DebugEvent.STEP_RETURN;
- break;
- }
- state = CDebugElementState.STEPPED;
- }
- else {
- disposeStackFrames();
- fireChangeEvent( DebugEvent.CONTENT );
- }
- setCurrent( false );
- setState( state );
- setCurrentStateInfo( null );
- fireResumeEvent( detail );
- }
-
- private void handleEndSteppingRange( ICDIEndSteppingRange endSteppingRange ) {
- fireSuspendEvent( DebugEvent.STEP_END );
- }
-
- private void handleBreakpointHit( ICDIBreakpointHit breakpointHit ) {
- IBreakpoint platformBreakpoint = ((CDebugTarget)getDebugTarget()).getBreakpointManager().getBreakpoint(breakpointHit.getBreakpoint());
- if (platformBreakpoint != null)
- CDebugCorePlugin.getDefault().getBreakpointActionManager().executeActions(platformBreakpoint, this);
- fireSuspendEvent( DebugEvent.BREAKPOINT );
- }
-
- private void handleWatchpointHit( ICDIWatchpointTrigger watchPointTrigger ) {
- IBreakpoint platformBreakpoint = ((CDebugTarget)getDebugTarget()).getBreakpointManager().getBreakpoint(watchPointTrigger.getWatchpoint());
- if (platformBreakpoint != null)
- CDebugCorePlugin.getDefault().getBreakpointActionManager().executeActions(platformBreakpoint, this);
- fireSuspendEvent( DebugEvent.BREAKPOINT );
- }
-
- private void handleSuspendedBySignal( ICDISignalReceived signal ) {
- fireSuspendEvent( DebugEvent.CLIENT_REQUEST );
- }
-
- private void handleTerminatedEvent( ICDIDestroyedEvent event ) {
- setState( CDebugElementState.TERMINATED );
- setCurrentStateInfo( null );
- terminated();
- }
-
- private void handleDisconnectedEvent( ICDIDisconnectedEvent event ) {
- setState( CDebugElementState.TERMINATED );
- setCurrentStateInfo( null );
- terminated();
- }
-
- private void handleChangedEvent( ICDIChangedEvent event ) {
- }
-
- /**
- * Cleans up the internal state of this thread.
- */
- protected void cleanup() {
- getCDISession().getEventManager().removeEventListener( this );
- disposeStackFrames();
-
- final ICDIThread cdiThread = getCDIThread();
- setCDIThread(null);
- if (cdiThread instanceof ICDIDisposable) {
- ((ICDIDisposable)cdiThread).dispose();
- }
- }
-
- private void setRefreshChildren( boolean refresh ) {
- fRefreshChildren = refresh;
- }
-
- private boolean refreshChildren() {
- return fRefreshChildren;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.core.model.IRestart#canRestart()
- */
- @Override
- public boolean canRestart() {
- return getDebugTarget() instanceof IRestart && ((IRestart)getDebugTarget()).canRestart();
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.core.model.IRestart#restart()
- */
- @Override
- public void restart() throws DebugException {
- if ( canRestart() ) {
- ((IRestart)getDebugTarget()).restart();
- }
- }
-
- protected boolean isCurrent() {
- return fIsCurrent;
- }
-
- protected void setCurrent( boolean current ) {
- boolean c = current;
- if ( !c ) {
- if ( getCDITarget().getConfiguration() instanceof ICDITargetConfiguration2
- && ((ICDITargetConfiguration2)getCDITarget().getConfiguration()).supportsThreadControl() )
- c = true; // When the debugger can control individual
- // threads treat every thread is "current"
- }
- fIsCurrent = c;
- }
-
- protected int getStackDepth() throws DebugException {
- int depth = 0;
- try {
- final ICDIThread cdiThread = getCDIThread();
- if (cdiThread != null) {
- depth = cdiThread.getStackFrameCount();
- }
- }
- catch( CDIException e ) {
- setStatus( ICDebugElementStatus.WARNING, MessageFormat.format( CoreModelMessages.getString( "CThread.1" ), new String[]{ e.getMessage() } ) ); //$NON-NLS-1$
- }
- return depth;
- }
-
- protected int getMaxStackDepth() {
- return MAX_STACK_DEPTH;
- }
-
- private void setLastStackDepth( int depth ) {
- fLastStackDepth = depth;
- }
-
- protected int getLastStackDepth() {
- return fLastStackDepth;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
- */
- @Override
- public Object getAdapter( Class adapter ) {
- if ( adapter.equals( IRunToLine.class ) ||
- adapter.equals( IRunToAddress.class ) ||
- adapter.equals( IResumeAtLine.class ) ||
- adapter.equals( IResumeAtAddress.class ) ||
- adapter.equals( IMoveToLine.class ) ||
- adapter.equals( IMoveToAddress.class ) ) {
- try {
- // Alain: Put a proper fix later.
- Object obj = getTopStackFrame();
- if (obj instanceof ICStackFrame) {
- return obj;
- }
- }
- catch( DebugException e ) {
- // do nothing
- }
- }
- if ( adapter.equals( CDebugElementState.class ) )
- return this;
- if ( adapter == ICStackFrame.class ) {
- try {
- // Alain: Put a proper fix later.
- Object obj = getTopStackFrame();
- if (obj instanceof ICStackFrame) {
- return obj;
- }
- }
- catch( DebugException e ) {
- // do nothing
- }
- }
- if ( adapter == IMemoryBlockRetrieval.class ) {
- return getDebugTarget().getAdapter( adapter );
- }
- if ( adapter == ICDIThread.class ) {
- return getCDIThread();
- }
- return super.getAdapter( adapter );
- }
-
- protected void dispose() {
- fDisposed = true;
- cleanup();
- }
-
- protected boolean isDisposed() {
- return fDisposed;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.core.model.IResumeWithoutSignal#canResumeWithoutSignal()
- */
- @Override
- public boolean canResumeWithoutSignal() {
- return (getDebugTarget() instanceof IResumeWithoutSignal && ((IResumeWithoutSignal)getDebugTarget()).canResumeWithoutSignal());
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.core.model.IResumeWithoutSignal#resumeWithoutSignal()
- */
- @Override
- public void resumeWithoutSignal() throws DebugException {
- if ( canResumeWithoutSignal() ) {
- ((IResumeWithoutSignal)getDebugTarget()).resumeWithoutSignal();
- }
- }
-
- /* (non-Javadoc)
- * @see java.lang.Object#toString()
- */
- @Override
- public String toString() {
- String result = ""; //$NON-NLS-1$
- try {
- result = getName();
- }
- catch( DebugException e ) {
- }
- return result;
- }
-
- protected void resumedByTarget( int detail, List events ) {
- syncWithBackend();
- if ( isCurrent() && detail != DebugEvent.CLIENT_REQUEST && detail != DebugEvent.UNSPECIFIED ) {
- setState( CDebugElementState.STEPPED );
- preserveStackFrames();
- events.add( createResumeEvent( detail ) );
- }
- else {
- setState( CDebugElementState.RESUMED );
- disposeStackFrames();
- // events.add( createResumeEvent( DebugEvent.CLIENT_REQUEST ) ); FIX FOR 218260
- }
- setCurrent( false );
- setCurrentStateInfo( null );
- }
-
- protected boolean isInstructionsteppingEnabled() {
- return ((CDebugTarget)getDebugTarget()).isInstructionSteppingEnabled();
- }
-
- protected void suspendByTarget( ICDISessionObject reason, ICDIThread suspensionThread ) {
- setState( CDebugElementState.SUSPENDED );
- setCurrentStateInfo( null );
- final ICDIThread cdiThread = getCDIThread();
- if ( cdiThread != null && cdiThread.equals( suspensionThread ) ) {
- setCurrent( true );
- setCurrentStateInfo( reason );
- if ( reason instanceof ICDIEndSteppingRange ) {
- handleEndSteppingRange( (ICDIEndSteppingRange)reason );
- }
- else if ( reason instanceof ICDIBreakpointHit ) {
- handleBreakpointHit( (ICDIBreakpointHit)reason );
- }
- else if ( reason instanceof ICDIWatchpointTrigger ) {
- handleWatchpointHit( (ICDIWatchpointTrigger)reason );
- }
- else if ( reason instanceof ICDISignalReceived ) {
- handleSuspendedBySignal( (ICDISignalReceived)reason );
- }
- else {
- // fireSuspendEvent( DebugEvent.CLIENT_REQUEST );
- // Temporary fix for bug 56520
- fireSuspendEvent( DebugEvent.BREAKPOINT );
- }
- }
- }
-
- private void syncWithBackend() {
- ICDIThread cdiThread = getCDIThread();
- if (cdiThread == null) {
- return;
- }
-
- ICDIThread currentThread = null;
- try {
- currentThread = cdiThread.getTarget().getCurrentThread();
- }
- catch( CDIException e ) {
- // ignore
- }
- setCurrent( cdiThread.equals( currentThread ) );
- }
-
-}

Back to the top