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:
parent
fd690737ac
commit
dba1e9d2bf
2 changed files with 54 additions and 64 deletions
|
@ -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.IBreakpoints.IBreakpointsTargetDMContext;
|
||||||
import org.eclipse.cdt.dsf.debug.service.IBreakpointsExtension.IBreakpointHitDMEvent;
|
import org.eclipse.cdt.dsf.debug.service.IBreakpointsExtension.IBreakpointHitDMEvent;
|
||||||
import org.eclipse.cdt.dsf.debug.service.ICachingService;
|
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.IProcessDMContext;
|
||||||
import org.eclipse.cdt.dsf.debug.service.IProcesses.IThreadDMContext;
|
import org.eclipse.cdt.dsf.debug.service.IProcesses.IThreadDMContext;
|
||||||
import org.eclipse.cdt.dsf.debug.service.IRunControl;
|
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.events.MIWatchpointTriggerEvent;
|
||||||
import org.eclipse.cdt.dsf.mi.service.command.output.MIBreakInsertInfo;
|
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.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.AbstractDsfService;
|
||||||
import org.eclipse.cdt.dsf.service.DsfServiceEventHandler;
|
import org.eclipse.cdt.dsf.service.DsfServiceEventHandler;
|
||||||
import org.eclipse.cdt.dsf.service.DsfSession;
|
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 ICommandControlService fConnection;
|
||||||
private CommandFactory fCommandFactory;
|
private CommandFactory fCommandFactory;
|
||||||
private IProcesses fProcessService;
|
private IGDBProcesses fProcessService;
|
||||||
|
|
||||||
private boolean fTerminated = false;
|
private boolean fTerminated = false;
|
||||||
|
|
||||||
|
@ -384,7 +385,7 @@ public class GDBRunControl_7_0_NS extends AbstractDsfService implements IMIRunCo
|
||||||
new Hashtable<String,String>());
|
new Hashtable<String,String>());
|
||||||
fConnection = getServicesTracker().getService(ICommandControlService.class);
|
fConnection = getServicesTracker().getService(ICommandControlService.class);
|
||||||
fCommandFactory = getServicesTracker().getService(IMICommandControl.class).getCommandFactory();
|
fCommandFactory = getServicesTracker().getService(IMICommandControl.class).getCommandFactory();
|
||||||
fProcessService = getServicesTracker().getService(IProcesses.class);
|
fProcessService = getServicesTracker().getService(IGDBProcesses.class);
|
||||||
|
|
||||||
getSession().addServiceEventListener(this, null);
|
getSession().addServiceEventListener(this, null);
|
||||||
rm.done();
|
rm.done();
|
||||||
|
@ -1599,8 +1600,57 @@ public class GDBRunControl_7_0_NS extends AbstractDsfService implements IMIRunCo
|
||||||
}
|
}
|
||||||
|
|
||||||
public void flushCache(IDMContext context) {
|
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,
|
private void moveToLocation(final IExecutionDMContext context,
|
||||||
final String location, final Map<String, Object> bpAttributes,
|
final String location, final Map<String, Object> bpAttributes,
|
||||||
final RequestMonitor rm) {
|
final RequestMonitor rm) {
|
||||||
|
|
|
@ -17,9 +17,6 @@ import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
|
||||||
import org.eclipse.cdt.dsf.concurrent.ImmediateExecutor;
|
import org.eclipse.cdt.dsf.concurrent.ImmediateExecutor;
|
||||||
import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
|
import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
|
||||||
import org.eclipse.cdt.dsf.datamodel.DMContexts;
|
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.IRunControl;
|
||||||
import org.eclipse.cdt.dsf.debug.service.IRunControl2;
|
import org.eclipse.cdt.dsf.debug.service.IRunControl2;
|
||||||
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService;
|
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.IMIRunControl;
|
||||||
import org.eclipse.cdt.dsf.mi.service.command.CommandFactory;
|
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.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.cdt.dsf.service.DsfSession;
|
||||||
import org.eclipse.core.runtime.IStatus;
|
import org.eclipse.core.runtime.IStatus;
|
||||||
import org.eclipse.core.runtime.Status;
|
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 ICommandControlService fConnection;
|
||||||
private CommandFactory fCommandFactory;
|
private CommandFactory fCommandFactory;
|
||||||
private IGDBProcesses fProcService;
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
// Initialization and shutdown
|
// Initialization and shutdown
|
||||||
|
@ -76,7 +70,6 @@ public class GDBRunControl_7_2_NS extends GDBRunControl_7_0_NS
|
||||||
new Hashtable<String,String>());
|
new Hashtable<String,String>());
|
||||||
fConnection = getServicesTracker().getService(ICommandControlService.class);
|
fConnection = getServicesTracker().getService(ICommandControlService.class);
|
||||||
fCommandFactory = getServicesTracker().getService(IMICommandControl.class).getCommandFactory();
|
fCommandFactory = getServicesTracker().getService(IMICommandControl.class).getCommandFactory();
|
||||||
fProcService = getServicesTracker().getService(IGDBProcesses.class);
|
|
||||||
getSession().addServiceEventListener(this, null);
|
getSession().addServiceEventListener(this, null);
|
||||||
rm.done();
|
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) {
|
private void doResumeContainer(IMIContainerDMContext context, final RequestMonitor rm) {
|
||||||
fConnection.queueCommand(fCommandFactory.createMIExecContinue(context), new DataRequestMonitor<MIInfo>(getExecutor(), 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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue