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

Committed patch adding initial implementation of multi-threading (bug 160038).

This commit is contained in:
Pawel Piech 2007-07-20 22:39:43 +00:00
parent 9ea8fb6e7e
commit 651bb074fb
4 changed files with 69 additions and 31 deletions

View file

@ -71,7 +71,7 @@ public class DsfTerminateCommand implements ITerminateHandler {
} else {
// Check the teriminate.
processes.canTerminate(
processes.getThreadForExecutionContext(dmc),
processes.getProcessForDebugContext(dmc),
new DataRequestMonitor<Boolean>(fExecutor, null) {
@Override
public void handleCompleted() {
@ -93,7 +93,7 @@ public class DsfTerminateCommand implements ITerminateHandler {
fExecutor.submit(new DsfCommandRunnable(fTracker, request.getElements()[0], request) {
@Override public void doExecute() {
getProcesses().terminate(
getProcesses().getThreadForExecutionContext(getContext()), new RequestMonitor(fExecutor, null));
getProcesses().getProcessForDebugContext(getContext()), new RequestMonitor(fExecutor, null));
}
});
return false;

View file

@ -19,7 +19,10 @@ import org.eclipse.dd.dsf.datamodel.IDMEvent;
import org.eclipse.dd.dsf.debug.service.IRunControl;
import org.eclipse.dd.dsf.debug.service.IStack;
import org.eclipse.dd.dsf.debug.service.IStepQueueManager;
import org.eclipse.dd.dsf.debug.service.IRunControl.IContainerSuspendedDMEvent;
import org.eclipse.dd.dsf.debug.service.IRunControl.IExecutionDMContext;
import org.eclipse.dd.dsf.debug.service.IRunControl.IResumedDMEvent;
import org.eclipse.dd.dsf.debug.service.IRunControl.ISuspendedDMEvent;
import org.eclipse.dd.dsf.debug.service.IRunControl.StateChangeReason;
import org.eclipse.dd.dsf.debug.service.IStack.IFrameDMContext;
import org.eclipse.dd.dsf.debug.service.IStack.IFrameDMData;
@ -91,7 +94,8 @@ public class StackFramesLayoutNode extends AbstractDMVMLayoutNode<IStack.IFrameD
}
// Store the VMC element array, in case we need to use it when
fCachedOldFrameVMCs = dmcs2vmcs(getData());
for (int i = 0; i < fCachedOldFrameVMCs.length; i++) update.setChild(fCachedOldFrameVMCs[i], i);
for (int i = 0; i < fCachedOldFrameVMCs.length; i++)
update.setChild(fCachedOldFrameVMCs[i], i);
update.done();
}
});
@ -127,7 +131,8 @@ public class StackFramesLayoutNode extends AbstractDMVMLayoutNode<IStack.IFrameD
// an array of VMCs with just the top frame.
if (fCachedOldFrameVMCs != null && fCachedOldFrameVMCs.length >= 1) {
fCachedOldFrameVMCs[0] = topFrameVmc;
for (int i = 0; i < fCachedOldFrameVMCs.length; i++) update.setChild(fCachedOldFrameVMCs[i], i);
for (int i = 0; i < fCachedOldFrameVMCs.length; i++)
update.setChild(fCachedOldFrameVMCs[i], i);
} else {
update.setChild(topFrameVmc, 0);
}
@ -209,10 +214,10 @@ public class StackFramesLayoutNode extends AbstractDMVMLayoutNode<IStack.IFrameD
protected int getNodeDeltaFlagsForDMEvent(org.eclipse.dd.dsf.datamodel.IDMEvent<?> e) {
// This node generates delta if the timers have changed, or if the
// label has changed.
if (e instanceof IRunControl.ISuspendedDMEvent) {
if (e instanceof ISuspendedDMEvent) {
return IModelDelta.CONTENT | IModelDelta.EXPAND | IModelDelta.SELECT;
} else if (e instanceof IRunControl.IResumedDMEvent) {
if (((IRunControl.IResumedDMEvent)e).getReason() == StateChangeReason.STEP) {
} else if (e instanceof IResumedDMEvent) {
if (((IResumedDMEvent)e).getReason() == StateChangeReason.STEP) {
return IModelDelta.STATE;
} else {
return IModelDelta.CONTENT;
@ -225,10 +230,12 @@ public class StackFramesLayoutNode extends AbstractDMVMLayoutNode<IStack.IFrameD
@Override
protected void buildDeltaForDMEvent(final IDMEvent<?> e, final VMDelta parent, final int nodeOffset, final RequestMonitor rm) {
if (e instanceof IRunControl.ISuspendedDMEvent) {
buildDeltaForSuspendedEvent((IRunControl.ISuspendedDMEvent)e, parent, nodeOffset, rm);
} else if (e instanceof IRunControl.IResumedDMEvent) {
buildDeltaForResumedEvent((IRunControl.IResumedDMEvent)e, parent, nodeOffset, rm);
if (e instanceof IContainerSuspendedDMEvent) {
buildDeltaForSuspendedEvent((ISuspendedDMEvent)e, ((IContainerSuspendedDMEvent)e).getTriggeringContext(), parent, nodeOffset, rm);
} else if (e instanceof ISuspendedDMEvent) {
buildDeltaForSuspendedEvent((ISuspendedDMEvent)e, ((ISuspendedDMEvent)e).getDMContext(), parent, nodeOffset, rm);
} else if (e instanceof IResumedDMEvent) {
buildDeltaForResumedEvent((IResumedDMEvent)e, parent, nodeOffset, rm);
} else if (e instanceof IStepQueueManager.ISteppingTimedOutEvent) {
buildDeltaForSteppingTimedOutEvent((IStepQueueManager.ISteppingTimedOutEvent)e, parent, nodeOffset, rm);
} else {
@ -237,7 +244,7 @@ public class StackFramesLayoutNode extends AbstractDMVMLayoutNode<IStack.IFrameD
}
}
private void buildDeltaForSuspendedEvent(final IRunControl.ISuspendedDMEvent e, final VMDelta parent, final int nodeOffset, final RequestMonitor rm) {
private void buildDeltaForSuspendedEvent(final ISuspendedDMEvent e, final IExecutionDMContext execCtx, final VMDelta parent, final int nodeOffset, final RequestMonitor rm) {
IRunControl runControlService = getServicesTracker().getService(IRunControl.class);
IStack stackService = getServicesTracker().getService(IStack.class);
if (stackService == null || runControlService == null) {
@ -249,7 +256,7 @@ public class StackFramesLayoutNode extends AbstractDMVMLayoutNode<IStack.IFrameD
// Refresh the whole list of stack frames unless the target is already stepping the next command. In
// which case, the refresh will occur when the stepping sequence slows down or stops. Trying to
// refresh the whole stack trace with every step would slow down stepping too much.
if (!runControlService.isStepping(e.getDMContext())) {
if (!runControlService.isStepping(execCtx)) {
parent.addFlags(IModelDelta.CONTENT);
}
@ -278,7 +285,7 @@ public class StackFramesLayoutNode extends AbstractDMVMLayoutNode<IStack.IFrameD
);
}
private void buildDeltaForResumedEvent(final IRunControl.IResumedDMEvent e, final VMDelta parent, final int nodeOffset, final RequestMonitor rm) {
private void buildDeltaForResumedEvent(final IResumedDMEvent e, final VMDelta parent, final int nodeOffset, final RequestMonitor rm) {
IStack stackService = getServicesTracker().getService(IStack.class);
if (stackService == null) {
// Required services have not initialized yet. Ignore the event.
@ -286,7 +293,7 @@ public class StackFramesLayoutNode extends AbstractDMVMLayoutNode<IStack.IFrameD
return;
}
IRunControl.IResumedDMEvent resumedEvent = e;
IResumedDMEvent resumedEvent = e;
if (resumedEvent.getReason() != StateChangeReason.STEP) {
// Refresh the list of stack frames only if the run operation is not a step. Also, clear the list
// of cached frames.

View file

@ -16,7 +16,6 @@ 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.IExecutionDMContext;
/**
* This interface provides access to the native OS's process
@ -28,27 +27,56 @@ import org.eclipse.dd.dsf.debug.service.IRunControl.IExecutionDMContext;
public interface INativeProcesses extends IDMService {
public interface IThreadDMContext extends IDMContext<IThreadDMData> {}
public interface IProcessDMContext extends IThreadDMContext {}
public interface IProcessDMContext extends IDMContext<IProcessDMData> {}
/**
* Interface for thread and process object data. This data provides a link
* to the lower level debugger services, in form of symbol, memory, and
* execution contexts.
* Interface for thread and process object data.
*/
public interface IThreadDMData extends IDMData {
String getName();
String getId();
boolean isDebuggerAttached();
IDMContext<?> getDebuggingContext();
IDMContext<?> getDebugContext();
}
/**
* Interface for thread and process object data.
*/
public interface IProcessDMData extends IDMData {
String getName();
String getId();
boolean isDebuggerAttached();
IDMContext<?> getDebugContext();
}
/**
* Event indicating that process data has changed.
*/
public interface ProcessChangedDMEvent extends IDMEvent<IProcessDMContext> {}
public interface IProcessChangedDMEvent extends IDMEvent<IProcessDMContext> {}
public IThreadDMContext getThreadForExecutionContext(IExecutionDMContext execCtx);
public interface IProcessStartedEvent extends IDMEvent<IDMContext<INativeProcesses>> {
IProcessDMContext getProcess();
}
public interface IProcessExitedEvent extends IDMEvent<IDMContext<INativeProcesses>> {
IProcessDMContext getProcess();
}
/**
* Returns a thread for the corresponding context. <code>null</code> if no corresponding
* thread exists.
* @param execCtx
* @return
*/
public IThreadDMContext getThreadForDebugContext(IDMContext<?> execCtx);
/**
* Returns a process context corresponding to the given context. <code>null</code> if no
* corresponding process exists.
*/
public IProcessDMContext getProcessForDebugContext(IDMContext<?> execCtx);
/**
* Retrieves the current list of processes running on target.
* @param rm Request completion monitor, to be filled in with array of process contexts.
@ -86,12 +114,13 @@ public interface INativeProcesses extends IDMService {
* @param thread Thread or process to terminate.
* @param rm Return token.
*/
void canTerminate(IThreadDMContext thread, DataRequestMonitor<Boolean> rm);
void canTerminate(IDMContext<?> ctx, DataRequestMonitor<Boolean> rm);
/**
* Terminates the selected process or thread.
* @param thread Thread or process to terminate.
* @param rm Request completion monitor, indicates success or failure.
*/
void terminate(IThreadDMContext thread, RequestMonitor requestMonitor);
void terminate(IDMContext<?> ctx, RequestMonitor requestMonitor);
}

View file

@ -39,6 +39,7 @@ public interface IRunControl extends IDMService
* for execution cotnexts, which by itself can perform run-control
* operations.
*/
public interface IContainerDMContext extends IExecutionDMContext {}
/** Flag indicating reason context state change. */
@ -50,16 +51,17 @@ public interface IRunControl extends IDMService
public interface ISuspendedDMEvent extends IDMEvent<IExecutionDMContext> {
StateChangeReason getReason();
}
public interface IResumedDMEvent extends IDMEvent<IExecutionDMContext> {
StateChangeReason getReason();
}
public interface IContainerSuspendedDMEvent extends IDMEvent<IExecutionDMContext> {
StateChangeReason getReason();
public interface IContainerSuspendedDMEvent extends ISuspendedDMEvent {
IExecutionDMContext getTriggeringContext();
}
public interface IContainerResumedDMEvent extends IDMEvent<IExecutionDMContext> {
StateChangeReason getReason();
public interface IContainerResumedDMEvent extends IResumedDMEvent {
}
/**
* Indicates that a new execution context (thread) was started. The DMC
* for the event is the container of the new exec context.