1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-03 07:05:24 +02:00

Bug 239050

some improvements to the IProcesses interface where needed:

1- getRunningProcesses() should take an IContainerDMContext as a parameter to prepare for multi-core/multi-processor debugging.

2- attachDebuggerToProcess() should return an IContainerDMContext as part of the requestMonitor.  This is because, once a process is attached to, it will then need to have a container context to use the RunControl service.

3- getProcessesBeingDebugged() should take an IContainerDMContext as a parameter to prepare for multi-core/multi-processor debugging.  Also, it should return an array of IContainerDMContexts as part of the requestMonitor;  this is because, processes that are being debugged should have a container context to use the RunControl service.
This commit is contained in:
Marc Khouzam 2008-07-08 13:40:27 +00:00
parent e3eb35603d
commit f440765624
3 changed files with 37 additions and 18 deletions

View file

@ -17,6 +17,7 @@ import org.eclipse.dd.dsf.datamodel.IDMContext;
import org.eclipse.dd.dsf.datamodel.IDMData;
import org.eclipse.dd.dsf.datamodel.IDMEvent;
import org.eclipse.dd.dsf.datamodel.IDMService;
import org.eclipse.dd.dsf.debug.service.IRunControl.IContainerDMContext;
/**
* This interface provides access to the OS's process
@ -68,14 +69,20 @@ public interface IProcesses extends IDMService {
/**
* Retrieves the current list of processes running on target.
* @param containerDmc The processor or core for which to list all processes
* @param rm Request completion monitor, to be filled in with array of process contexts.
*/
void getRunningProcesses(DataRequestMonitor<IProcessDMContext[]> rm);
void getRunningProcesses(IContainerDMContext containerDmc, DataRequestMonitor<IProcessDMContext[]> rm);
/**
* Attaches debugger to the given process.
*/
void attachDebuggerToProcess(IProcessDMContext procCtx, RequestMonitor requestMonitor);
* Attaches debugger to the given process.
* When attaching to a process, a container context can now be used to characterize the process.
* IContainerDMContext has IProcessDMContext as a parent. This method can optionally choose
* to return the IContainerDMContext inside the DataRequestMonitor. This can be useful for
* backends that do not have the ability to obtain the different IContainerDMContexts through
* {@link getProcessesBeingDebugged}
*/
void attachDebuggerToProcess(IProcessDMContext procCtx, DataRequestMonitor<IContainerDMContext> rm);
/**
* Detaches debugger from the given process.
@ -99,9 +106,12 @@ public interface IProcesses extends IDMService {
/**
* Retrieves the list of processes which are currently under
* debugger control.
* @param rm Request completion monitor.
* @param containerDmc The processor or core for which to list processes being debugged
* @param rm Request completion monitor which contains all container contexts representing
* the processes being debugged. Note that each of these containers also has
* IProcessDMContext as a parent.
*/
void getProcessesBeingDebugged(DataRequestMonitor<IProcessDMContext[]> rm);
void getProcessesBeingDebugged(IContainerDMContext containerDmc, DataRequestMonitor<IContainerDMContext[]> rm);
/**
* Checks whether the given process or thread can be terminated.

View file

@ -38,6 +38,7 @@ import org.eclipse.dd.dsf.concurrent.DsfExecutor;
import org.eclipse.dd.dsf.concurrent.RequestMonitor;
import org.eclipse.dd.dsf.concurrent.Sequence;
import org.eclipse.dd.dsf.debug.service.IProcesses.IProcessDMContext;
import org.eclipse.dd.dsf.debug.service.IRunControl.IContainerDMContext;
import org.eclipse.dd.dsf.service.DsfServicesTracker;
import org.eclipse.dd.gdb.internal.GdbPlugin;
import org.eclipse.dd.gdb.internal.provisional.IGDBLaunchConfigurationConstants;
@ -444,18 +445,18 @@ public class FinalLaunchSequence extends Sequence {
fProcService.attachDebuggerToProcess(
procDmc,
new DataRequestMonitor<MIInfo>(getExecutor(), requestMonitor));
new DataRequestMonitor<IContainerDMContext>(getExecutor(), requestMonitor));
} else {
promptForProcessID(fLaunch.getLaunchConfiguration(),
promptForProcessID(fLaunch.getLaunchConfiguration(),
new DataRequestMonitor<Integer>(getExecutor(), requestMonitor) {
@Override
protected void handleSuccess() {
IProcessDMContext procDmc =
IProcessDMContext procDmc =
fProcService.createProcessContext(Integer.toString(getData()));
fProcService.attachDebuggerToProcess(
procDmc,
new DataRequestMonitor<MIInfo>(getExecutor(), requestMonitor));
new DataRequestMonitor<IContainerDMContext>(getExecutor(), requestMonitor));
}
});
}

View file

@ -21,6 +21,7 @@ import org.eclipse.dd.dsf.concurrent.RequestMonitor;
import org.eclipse.dd.dsf.datamodel.AbstractDMContext;
import org.eclipse.dd.dsf.datamodel.IDMContext;
import org.eclipse.dd.dsf.debug.service.IProcesses;
import org.eclipse.dd.dsf.debug.service.IRunControl.IContainerDMContext;
import org.eclipse.dd.dsf.service.AbstractDsfService;
import org.eclipse.dd.dsf.service.DsfSession;
import org.eclipse.dd.gdb.internal.GdbPlugin;
@ -87,7 +88,6 @@ public class GDBProcesses extends AbstractDsfService implements IProcesses {
* <p/>
*
* @param sessionId Session that this context belongs to.
* @param name process name
* @param id process identifier.
*/
protected GdbProcessDMC(String sessionId, String id) {
@ -235,7 +235,8 @@ public class GDBProcesses extends AbstractDsfService implements IProcesses {
public void getExecutionData(IThreadDMContext dmc, DataRequestMonitor<IThreadDMData> rm) {
// We must first check for GdbProcessDMC because it is also a GdbThreadDMC
if (dmc instanceof GdbProcessDMC) {
rm.setData(new GdbThreadDMData("", ((GdbProcessDMC)dmc).getId())); //$NON-NLS-1$
rm.setData(new GdbThreadDMData(fCommandControl.getExecutablePath().lastSegment(),
((GdbProcessDMC)dmc).getId()));
rm.done();
} else if (dmc instanceof GdbThreadDMC) {
rm.setData(new GdbThreadDMData("", ((GdbThreadDMC)dmc).getId())); //$NON-NLS-1$
@ -246,7 +247,7 @@ public class GDBProcesses extends AbstractDsfService implements IProcesses {
}
}
public void attachDebuggerToProcess(IProcessDMContext procCtx, final RequestMonitor rm) {
public void attachDebuggerToProcess(IProcessDMContext procCtx, final DataRequestMonitor<IContainerDMContext> rm) {
if (procCtx instanceof GdbProcessDMC) {
int pid;
try {
@ -259,7 +260,14 @@ public class GDBProcesses extends AbstractDsfService implements IProcesses {
fCommandControl.queueCommand(
new CLIAttach(procCtx, pid),
new DataRequestMonitor<MIInfo>(getExecutor(), rm));
new DataRequestMonitor<MIInfo>(getExecutor(), rm) {
@Override
protected void handleSuccess() {
rm.setData(null);
rm.done();
}
});
} else {
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, INTERNAL_ERROR, "Invalid process context.", null)); //$NON-NLS-1$
rm.done();
@ -299,20 +307,20 @@ public class GDBProcesses extends AbstractDsfService implements IProcesses {
NOT_SUPPORTED, "Not supported", null)); //$NON-NLS-1$
rm.done();
}
public void getProcessesBeingDebugged(DataRequestMonitor<IProcessDMContext[]> rm) {
public void getProcessesBeingDebugged(IContainerDMContext containerDmc, DataRequestMonitor<IContainerDMContext[]> rm) {
// use -list-thread-groups
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID,
NOT_SUPPORTED, "Not supported", null)); //$NON-NLS-1$
rm.done();
}
public void getRunningProcesses(DataRequestMonitor<IProcessDMContext[]> rm) {
public void getRunningProcesses(IContainerDMContext containerDmc, DataRequestMonitor<IProcessDMContext[]> rm) {
// use -list-thread-groups for local session
// monitor list processes is only for remote session
fCommandControl.queueCommand(
new CLIMonitorListProcesses(fCommandControl.getControlDMContext()),
new CLIMonitorListProcesses(containerDmc),
new DataRequestMonitor<CLIMonitorListProcessesInfo>(getExecutor(), rm) {
@Override
protected void handleSuccess() {