From dd5492be1469ade08a1ef5b58f1558c1d742528a Mon Sep 17 00:00:00 2001 From: Mikhail Khodjaiants Date: Thu, 29 Aug 2002 00:24:30 +0000 Subject: [PATCH] Partial solution for multithreaded resume and suspend. --- .../internal/core/model/CDebugTarget.java | 61 ++++++++- .../debug/internal/core/model/CThread.java | 118 +++++++++++------- 2 files changed, 129 insertions(+), 50 deletions(-) diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CDebugTarget.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CDebugTarget.java index 90c078a5210..52de6d596c7 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CDebugTarget.java +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CDebugTarget.java @@ -445,8 +445,13 @@ public class CDebugTarget extends CDebugElement * 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 ); } + setCurrentThread(); return newThreads; } @@ -698,7 +704,7 @@ public class CDebugTarget extends CDebugElement handleSuspendedEvent( (ICDISuspendedEvent)event ); } } - else if ( event instanceof ICDIResumedEvent || source instanceof ICDIThread ) + else if ( event instanceof ICDIResumedEvent ) { if ( source instanceof ICDITarget ) { @@ -995,7 +1001,13 @@ public class CDebugTarget extends CDebugElement ICDISessionObject reason = event.getReason(); setCurrentStateInfo( reason ); 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() ); if ( thread != null && newThreads.contains( thread ) ) @@ -1023,7 +1035,25 @@ public class CDebugTarget extends CDebugElement setCurrentStateId( IState.RUNNING ); setCurrentStateInfo( null ); 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 ) @@ -1240,4 +1270,27 @@ public class CDebugTarget extends CDebugElement { 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 ); + } + } } 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 index 59698af6dde..acc9a080850 100644 --- 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 @@ -12,6 +12,7 @@ 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.IInstructionStep; import org.eclipse.cdt.debug.core.IRestart; import org.eclipse.cdt.debug.core.IState; @@ -89,6 +90,11 @@ public class CThread extends CDebugElement */ private ICDIConfiguration fConfig; + /** + * Whether this thread is current. + */ + private boolean fIsCurrent = false; + /** * Constructor for CThread. * @param target @@ -381,7 +387,8 @@ public class CThread extends CDebugElement { if ( event instanceof ICDISuspendedEvent ) { - if ( source instanceof ICDIThread ) + if ( ( source instanceof ICDIThread && getCDIThread().equals( (ICDIThread)source ) ) || + source instanceof ICDITarget ) { handleSuspendedEvent( (ICDISuspendedEvent)event ); } @@ -415,13 +422,6 @@ public class CThread extends CDebugElement handleChangedEvent( (ICDIChangedEvent)event ); } } - //else if ( event instanceof ICDISteppingEvent ) - //{ - // if ( source instanceof ICDIThread ) - // { - // handleSteppingEvent( (ICDISteppingEvent)event ); - // } - //} } } @@ -780,25 +780,34 @@ public class CThread extends CDebugElement private void handleSuspendedEvent( ICDISuspendedEvent event ) { setRunning( false ); + if ( event.getSource() instanceof ICDITarget ) + { + if ( isCurrent() ) + { + setCurrentStateId( IState.SUSPENDED ); + ICDISessionObject reason = event.getReason(); + setCurrentStateInfo( reason ); + if ( reason instanceof ICDIEndSteppingRange ) + { + handleEndSteppingRange( (ICDIEndSteppingRange)reason ); + } + else if ( reason instanceof ICDIBreakpoint ) + { + handleBreakpointHit( (ICDIBreakpoint)reason ); + } + else if ( reason instanceof ICDISignal ) + { + handleSuspendedBySignal( (ICDISignal)reason ); + } + else + { + fireSuspendEvent( DebugEvent.CLIENT_REQUEST ); + } + } + return; + } setCurrentStateId( IState.SUSPENDED ); - ICDISessionObject reason = event.getReason(); - setCurrentStateInfo( reason ); - if ( reason instanceof ICDIEndSteppingRange ) - { - handleEndSteppingRange( (ICDIEndSteppingRange)reason ); - } - else if ( reason instanceof ICDIBreakpoint ) - { - handleBreakpointHit( (ICDIBreakpoint)reason ); - } - else if ( reason instanceof ICDISignal ) - { - handleSuspendedBySignal( (ICDISignal)reason ); - } - else - { - fireSuspendEvent( DebugEvent.CLIENT_REQUEST ); - } + setCurrentStateInfo( null ); } private void handleResumedEvent( ICDIResumedEvent event ) @@ -807,28 +816,35 @@ public class CThread extends CDebugElement setCurrentStateId( IState.RUNNING ); setCurrentStateInfo( null ); int detail = DebugEvent.UNSPECIFIED; - switch( event.getType() ) + if ( isCurrent() ) { - case ICDIResumedEvent.CONTINUE: - detail = DebugEvent.CLIENT_REQUEST; - disposeStackFrames(); - break; - case ICDIResumedEvent.STEP_INTO: - case ICDIResumedEvent.STEP_INTO_INSTRUCTION: - detail = DebugEvent.STEP_INTO; - preserveStackFrames(); - break; - case ICDIResumedEvent.STEP_OVER: - case ICDIResumedEvent.STEP_OVER_INSTRUCTION: - detail = DebugEvent.STEP_OVER; - preserveStackFrames(); - break; - case ICDIResumedEvent.STEP_RETURN: - detail = DebugEvent.STEP_RETURN; - preserveStackFrames(); - break; + switch( event.getType() ) + { + case ICDIResumedEvent.CONTINUE: + detail = DebugEvent.CLIENT_REQUEST; + disposeStackFrames(); + break; + case ICDIResumedEvent.STEP_INTO: + case ICDIResumedEvent.STEP_INTO_INSTRUCTION: + detail = DebugEvent.STEP_INTO; + preserveStackFrames(); + break; + case ICDIResumedEvent.STEP_OVER: + case ICDIResumedEvent.STEP_OVER_INSTRUCTION: + detail = DebugEvent.STEP_OVER; + preserveStackFrames(); + break; + case ICDIResumedEvent.STEP_RETURN: + detail = DebugEvent.STEP_RETURN; + preserveStackFrames(); + break; + } + } + else + { + disposeStackFrames(); + fireResumeEvent( DebugEvent.CLIENT_REQUEST ); } - fireResumeEvent( detail ); } private void handleEndSteppingRange( ICDIEndSteppingRange endSteppingRange ) @@ -921,4 +937,14 @@ public class CThread extends CDebugElement ((IRestart)getDebugTarget()).restart(); } } + + protected boolean isCurrent() + { + return fIsCurrent; + } + + protected void setCurrent( boolean current ) + { + fIsCurrent = current; + } }