1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Bug 353423: Move refreshing of thread states from GDBRunControl_7_2_NS to GDBRunControl_7_0_NS since -thread-info is available since GDB 7.0

This commit is contained in:
Marc Khouzam 2011-08-02 14:01:39 -04:00
parent fd690737ac
commit dba1e9d2bf
2 changed files with 54 additions and 64 deletions

View file

@ -38,7 +38,6 @@ import org.eclipse.cdt.dsf.debug.service.IBreakpoints.IBreakpointDMContext;
import org.eclipse.cdt.dsf.debug.service.IBreakpoints.IBreakpointsTargetDMContext;
import org.eclipse.cdt.dsf.debug.service.IBreakpointsExtension.IBreakpointHitDMEvent;
import org.eclipse.cdt.dsf.debug.service.ICachingService;
import org.eclipse.cdt.dsf.debug.service.IProcesses;
import org.eclipse.cdt.dsf.debug.service.IProcesses.IProcessDMContext;
import org.eclipse.cdt.dsf.debug.service.IProcesses.IThreadDMContext;
import org.eclipse.cdt.dsf.debug.service.IRunControl;
@ -77,6 +76,8 @@ import org.eclipse.cdt.dsf.mi.service.command.events.MIThreadExitEvent;
import org.eclipse.cdt.dsf.mi.service.command.events.MIWatchpointTriggerEvent;
import org.eclipse.cdt.dsf.mi.service.command.output.MIBreakInsertInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIThread;
import org.eclipse.cdt.dsf.mi.service.command.output.MIThreadInfoInfo;
import org.eclipse.cdt.dsf.service.AbstractDsfService;
import org.eclipse.cdt.dsf.service.DsfServiceEventHandler;
import org.eclipse.cdt.dsf.service.DsfSession;
@ -319,7 +320,7 @@ public class GDBRunControl_7_0_NS extends AbstractDsfService implements IMIRunCo
private ICommandControlService fConnection;
private CommandFactory fCommandFactory;
private IProcesses fProcessService;
private IGDBProcesses fProcessService;
private boolean fTerminated = false;
@ -384,7 +385,7 @@ public class GDBRunControl_7_0_NS extends AbstractDsfService implements IMIRunCo
new Hashtable<String,String>());
fConnection = getServicesTracker().getService(ICommandControlService.class);
fCommandFactory = getServicesTracker().getService(IMICommandControl.class).getCommandFactory();
fProcessService = getServicesTracker().getService(IProcesses.class);
fProcessService = getServicesTracker().getService(IGDBProcesses.class);
getSession().addServiceEventListener(this, null);
rm.done();
@ -1599,8 +1600,57 @@ public class GDBRunControl_7_0_NS extends AbstractDsfService implements IMIRunCo
}
public void flushCache(IDMContext context) {
refreshThreadStates();
}
/**
* Gets the state of each thread from GDB and updates our internal map.
* @since 4.1
*/
protected void refreshThreadStates() {
fConnection.queueCommand(
fCommandFactory.createMIThreadInfo(fConnection.getContext()),
new DataRequestMonitor<MIThreadInfoInfo>(getExecutor(), null) {
@Override
protected void handleSuccess() {
MIThread[] threadList = getData().getThreadList();
for (MIThread thread : threadList) {
String threadId = thread.getThreadId();
IMIContainerDMContext containerDmc =
fProcessService.createContainerContextFromThreadId(fConnection.getContext(), threadId);
IProcessDMContext processDmc = DMContexts.getAncestorOfType(containerDmc, IProcessDMContext.class);
IThreadDMContext threadDmc =
fProcessService.createThreadContext(processDmc, threadId);
IMIExecutionDMContext execDmc = fProcessService.createExecutionContext(containerDmc, threadDmc, threadId);
MIThreadRunState threadState = fThreadRunStates.get(execDmc);
if (threadState != null) {
// We may not know this thread. This can happen when dealing with a remote
// where thread events are not reported immediately.
// However, the -thread-info command we just sent will make
// GDB send those events. Therefore, we can just ignore threads we don't
// know about, and wait for those events.
if (MIThread.MI_THREAD_STATE_RUNNING.equals(thread.getState())) {
if (threadState.fSuspended == true) {
// We missed a resumed event! Send it now.
IResumedDMEvent resumedEvent = new ResumedEvent(execDmc, null);
fConnection.getSession().dispatchEvent(resumedEvent, getProperties());
}
} else if (MIThread.MI_THREAD_STATE_STOPPED.equals(thread.getState())) {
if (threadState.fSuspended == false) {
// We missed a suspend event! Send it now.
ISuspendedDMEvent suspendedEvent = new SuspendedEvent(execDmc, null);
fConnection.getSession().dispatchEvent(suspendedEvent, getProperties());
}
} else {
assert false : "Invalid thread state: " + thread.getState(); //$NON-NLS-1$
}
}
}
}
});
}
private void moveToLocation(final IExecutionDMContext context,
final String location, final Map<String, Object> bpAttributes,
final RequestMonitor rm) {

View file

@ -17,9 +17,6 @@ import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
import org.eclipse.cdt.dsf.concurrent.ImmediateExecutor;
import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
import org.eclipse.cdt.dsf.datamodel.DMContexts;
import org.eclipse.cdt.dsf.datamodel.IDMContext;
import org.eclipse.cdt.dsf.debug.service.IProcesses.IProcessDMContext;
import org.eclipse.cdt.dsf.debug.service.IProcesses.IThreadDMContext;
import org.eclipse.cdt.dsf.debug.service.IRunControl;
import org.eclipse.cdt.dsf.debug.service.IRunControl2;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService;
@ -30,8 +27,6 @@ import org.eclipse.cdt.dsf.mi.service.IMIExecutionDMContext;
import org.eclipse.cdt.dsf.mi.service.IMIRunControl;
import org.eclipse.cdt.dsf.mi.service.command.CommandFactory;
import org.eclipse.cdt.dsf.mi.service.command.output.MIInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIThread;
import org.eclipse.cdt.dsf.mi.service.command.output.MIThreadInfoInfo;
import org.eclipse.cdt.dsf.service.DsfSession;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
@ -46,7 +41,6 @@ public class GDBRunControl_7_2_NS extends GDBRunControl_7_0_NS
private ICommandControlService fConnection;
private CommandFactory fCommandFactory;
private IGDBProcesses fProcService;
///////////////////////////////////////////////////////////////////////////
// Initialization and shutdown
@ -76,7 +70,6 @@ public class GDBRunControl_7_2_NS extends GDBRunControl_7_0_NS
new Hashtable<String,String>());
fConnection = getServicesTracker().getService(ICommandControlService.class);
fCommandFactory = getServicesTracker().getService(IMICommandControl.class).getCommandFactory();
fProcService = getServicesTracker().getService(IGDBProcesses.class);
getSession().addServiceEventListener(this, null);
rm.done();
}
@ -175,58 +168,5 @@ public class GDBRunControl_7_2_NS extends GDBRunControl_7_0_NS
private void doResumeContainer(IMIContainerDMContext context, final RequestMonitor rm) {
fConnection.queueCommand(fCommandFactory.createMIExecContinue(context), new DataRequestMonitor<MIInfo>(getExecutor(), rm));
}
/**
* @since 4.1
*/
protected void refreshThreads() {
fConnection.queueCommand(
fCommandFactory.createMIThreadInfo(fConnection.getContext()),
new DataRequestMonitor<MIThreadInfoInfo>(getExecutor(), null) {
@Override
protected void handleSuccess() {
MIThread[] threadList = getData().getThreadList();
for (MIThread thread : threadList) {
String threadId = thread.getThreadId();
IMIContainerDMContext containerDmc =
fProcService.createContainerContextFromThreadId(fConnection.getContext(), threadId);
IProcessDMContext processDmc = DMContexts.getAncestorOfType(containerDmc, IProcessDMContext.class);
IThreadDMContext threadDmc =
fProcService.createThreadContext(processDmc, threadId);
IMIExecutionDMContext execDmc = fProcService.createExecutionContext(containerDmc, threadDmc, threadId);
MIThreadRunState threadState = fThreadRunStates.get(execDmc);
if (threadState != null) {
// We may not know this thread. This can happen when dealing with a remote
// where thread events are not reported immediately.
// However, the -list-thread-groups command we just sent will make
// GDB send those events. Therefore, we can just ignore threads we don't
// know about, and wait for those events.
if (MIThread.MI_THREAD_STATE_RUNNING.equals(thread.getState())) {
if (threadState.fSuspended == true) {
// We missed a resumed event! Send it now.
IResumedDMEvent resumedEvent = new ResumedEvent(execDmc, null);
fConnection.getSession().dispatchEvent(resumedEvent, getProperties());
}
} else if (MIThread.MI_THREAD_STATE_STOPPED.equals(thread.getState())) {
if (threadState.fSuspended == false) {
// We missed a suspend event! Send it now.
ISuspendedDMEvent suspendedEvent = new SuspendedEvent(execDmc, null);
fConnection.getSession().dispatchEvent(suspendedEvent, getProperties());
}
} else {
assert false : "Invalid thread state: " + thread.getState(); //$NON-NLS-1$
}
}
}
}
});
}
@Override
public void flushCache(IDMContext context) {
super.flushCache(context);
refreshThreads();
}
}
}