From 6a3d9e2e9e388fd0958ace994042ba283c06a58d Mon Sep 17 00:00:00 2001 From: Mikhail Khodjaiants Date: Fri, 2 Feb 2007 12:51:19 +0000 Subject: [PATCH] Bug 155464: Thread mix-up when debugging multi-threaded programs. --- .../cdt/debug/internal/core/model/CThread.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) 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 b614a3af4dc..f95a5bc4216 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 @@ -7,6 +7,7 @@ * * Contributors: * QNX Software Systems - Initial API and implementation + * Stefan Bylund (Enea, steby@enea.se) - patch for bug 155464 *******************************************************************************/ package org.eclipse.cdt.debug.internal.core.model; @@ -693,6 +694,7 @@ public class CThread extends CDebugElement implements ICThread, IRestart, IResum private void handleResumedEvent( ICDIResumedEvent event ) { CDebugElementState state = CDebugElementState.RESUMED; int detail = DebugEvent.RESUME; + syncWithBackend(); if ( isCurrent() && event.getType() != ICDIResumedEvent.CONTINUE ) { preserveStackFrames(); switch( event.getType() ) { @@ -893,6 +895,7 @@ public class CThread extends CDebugElement implements ICThread, IRestart, IResum } protected void resumedByTarget( int detail, List events ) { + syncWithBackend(); if ( isCurrent() && detail != DebugEvent.CLIENT_REQUEST && detail != DebugEvent.UNSPECIFIED ) { setState( CDebugElementState.STEPPED ); preserveStackFrames(); @@ -933,4 +936,16 @@ public class CThread extends CDebugElement implements ICThread, IRestart, IResum } } } + + private void syncWithBackend() { + ICDIThread cdiThread = getCDIThread(); + ICDIThread currentThread = null; + try { + currentThread = cdiThread.getTarget().getCurrentThread(); + } + catch( CDIException e ) { + // ignore + } + setCurrent( cdiThread.equals( currentThread ) ); + } }