1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-22 06:02:11 +02:00

Partial solution for multithreaded resume and suspend.

This commit is contained in:
Mikhail Khodjaiants 2002-08-29 00:24:30 +00:00
parent 9461885204
commit dd5492be14
2 changed files with 129 additions and 50 deletions

View file

@ -445,8 +445,13 @@ public class CDebugTarget extends CDebugElement
* Notifies threads that they have been suspended. * Notifies threads that they have been suspended.
* *
*/ */
protected void suspendThreads() protected void suspendThreads( ICDISuspendedEvent event )
{ {
Iterator it = getThreadList().iterator();
while( it.hasNext() )
{
((CThread)it.next()).handleDebugEvent( event );
}
} }
/** /**
@ -491,6 +496,7 @@ public class CDebugTarget extends CDebugElement
{ {
CDebugCorePlugin.log( e ); CDebugCorePlugin.log( e );
} }
setCurrentThread();
return newThreads; return newThreads;
} }
@ -698,7 +704,7 @@ public class CDebugTarget extends CDebugElement
handleSuspendedEvent( (ICDISuspendedEvent)event ); handleSuspendedEvent( (ICDISuspendedEvent)event );
} }
} }
else if ( event instanceof ICDIResumedEvent || source instanceof ICDIThread ) else if ( event instanceof ICDIResumedEvent )
{ {
if ( source instanceof ICDITarget ) if ( source instanceof ICDITarget )
{ {
@ -995,7 +1001,13 @@ public class CDebugTarget extends CDebugElement
ICDISessionObject reason = event.getReason(); ICDISessionObject reason = event.getReason();
setCurrentStateInfo( reason ); setCurrentStateInfo( reason );
List newThreads = refreshThreads(); List newThreads = refreshThreads();
if ( event.getSource() instanceof ICDIThread ) if ( event.getSource() instanceof ICDITarget )
{
suspendThreads( event );
}
// We need this for debuggers that don't have notifications
// for newly created threads.
else if ( event.getSource() instanceof ICDIThread )
{ {
CThread thread = findThread( (ICDIThread)event.getSource() ); CThread thread = findThread( (ICDIThread)event.getSource() );
if ( thread != null && newThreads.contains( thread ) ) if ( thread != null && newThreads.contains( thread ) )
@ -1023,7 +1035,25 @@ public class CDebugTarget extends CDebugElement
setCurrentStateId( IState.RUNNING ); setCurrentStateId( IState.RUNNING );
setCurrentStateInfo( null ); setCurrentStateInfo( null );
resumeThreads( event ); resumeThreads( event );
fireResumeEvent( DebugEvent.UNSPECIFIED ); int detail = DebugEvent.UNSPECIFIED;
switch( event.getType() )
{
case ICDIResumedEvent.CONTINUE:
detail = DebugEvent.CLIENT_REQUEST;
break;
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;
}
fireResumeEvent( detail );
} }
private void handleEndSteppingRange( ICDIEndSteppingRange endSteppingRange ) private void handleEndSteppingRange( ICDIEndSteppingRange endSteppingRange )
@ -1240,4 +1270,27 @@ public class CDebugTarget extends CDebugElement
{ {
return fSourceLocator; return fSourceLocator;
} }
protected void setCurrentThread()
{
ICDIThread currentCDIThread = null;
try
{
currentCDIThread = getCDITarget().getCurrentThread();
}
catch( CDIException e )
{
CDebugCorePlugin.log( e );
}
Iterator it = getThreadList().iterator();
while( it.hasNext() )
{
CThread thread = (CThread)it.next();
thread.setCurrent( currentCDIThread != null && thread.getCDIThread().equals( currentCDIThread ) );
}
if ( currentCDIThread == null && !getThreadList().isEmpty() )
{
((CThread)getThreadList().get( 0 )).setCurrent( true );
}
}
} }

View file

@ -12,6 +12,7 @@ import java.util.Collections;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
import org.eclipse.cdt.debug.core.IInstructionStep; import org.eclipse.cdt.debug.core.IInstructionStep;
import org.eclipse.cdt.debug.core.IRestart; import org.eclipse.cdt.debug.core.IRestart;
import org.eclipse.cdt.debug.core.IState; import org.eclipse.cdt.debug.core.IState;
@ -89,6 +90,11 @@ public class CThread extends CDebugElement
*/ */
private ICDIConfiguration fConfig; private ICDIConfiguration fConfig;
/**
* Whether this thread is current.
*/
private boolean fIsCurrent = false;
/** /**
* Constructor for CThread. * Constructor for CThread.
* @param target * @param target
@ -381,7 +387,8 @@ public class CThread extends CDebugElement
{ {
if ( event instanceof ICDISuspendedEvent ) if ( event instanceof ICDISuspendedEvent )
{ {
if ( source instanceof ICDIThread ) if ( ( source instanceof ICDIThread && getCDIThread().equals( (ICDIThread)source ) ) ||
source instanceof ICDITarget )
{ {
handleSuspendedEvent( (ICDISuspendedEvent)event ); handleSuspendedEvent( (ICDISuspendedEvent)event );
} }
@ -415,13 +422,6 @@ public class CThread extends CDebugElement
handleChangedEvent( (ICDIChangedEvent)event ); handleChangedEvent( (ICDIChangedEvent)event );
} }
} }
//else if ( event instanceof ICDISteppingEvent )
//{
// if ( source instanceof ICDIThread )
// {
// handleSteppingEvent( (ICDISteppingEvent)event );
// }
//}
} }
} }
@ -780,6 +780,10 @@ public class CThread extends CDebugElement
private void handleSuspendedEvent( ICDISuspendedEvent event ) private void handleSuspendedEvent( ICDISuspendedEvent event )
{ {
setRunning( false ); setRunning( false );
if ( event.getSource() instanceof ICDITarget )
{
if ( isCurrent() )
{
setCurrentStateId( IState.SUSPENDED ); setCurrentStateId( IState.SUSPENDED );
ICDISessionObject reason = event.getReason(); ICDISessionObject reason = event.getReason();
setCurrentStateInfo( reason ); setCurrentStateInfo( reason );
@ -800,6 +804,11 @@ public class CThread extends CDebugElement
fireSuspendEvent( DebugEvent.CLIENT_REQUEST ); fireSuspendEvent( DebugEvent.CLIENT_REQUEST );
} }
} }
return;
}
setCurrentStateId( IState.SUSPENDED );
setCurrentStateInfo( null );
}
private void handleResumedEvent( ICDIResumedEvent event ) private void handleResumedEvent( ICDIResumedEvent event )
{ {
@ -807,6 +816,8 @@ public class CThread extends CDebugElement
setCurrentStateId( IState.RUNNING ); setCurrentStateId( IState.RUNNING );
setCurrentStateInfo( null ); setCurrentStateInfo( null );
int detail = DebugEvent.UNSPECIFIED; int detail = DebugEvent.UNSPECIFIED;
if ( isCurrent() )
{
switch( event.getType() ) switch( event.getType() )
{ {
case ICDIResumedEvent.CONTINUE: case ICDIResumedEvent.CONTINUE:
@ -828,7 +839,12 @@ public class CThread extends CDebugElement
preserveStackFrames(); preserveStackFrames();
break; break;
} }
fireResumeEvent( detail ); }
else
{
disposeStackFrames();
fireResumeEvent( DebugEvent.CLIENT_REQUEST );
}
} }
private void handleEndSteppingRange( ICDIEndSteppingRange endSteppingRange ) private void handleEndSteppingRange( ICDIEndSteppingRange endSteppingRange )
@ -921,4 +937,14 @@ public class CThread extends CDebugElement
((IRestart)getDebugTarget()).restart(); ((IRestart)getDebugTarget()).restart();
} }
} }
protected boolean isCurrent()
{
return fIsCurrent;
}
protected void setCurrent( boolean current )
{
fIsCurrent = current;
}
} }