From e42dcea7a8573ded4c08a972eeaf3edbdb76cbbf Mon Sep 17 00:00:00 2001 From: Pawel Piech Date: Fri, 28 Mar 2008 17:42:49 +0000 Subject: [PATCH] [158610] Converted the IRunControl.can*() methods to be asynchronous. --- .../debug/ui/actions/DsfResumeCommand.java | 12 +- .../debug/ui/actions/DsfStepIntoCommand.java | 12 +- .../debug/ui/actions/DsfStepOverCommand.java | 12 +- .../ui/actions/DsfStepReturnCommand.java | 12 +- .../debug/ui/actions/DsfSuspendCommand.java | 12 +- .../dd/dsf/debug/service/IRunControl.java | 10 +- .../dsf/debug/service/StepQueueManager.java | 113 ++++++++---------- .../examples/pda/service/PDARunControl.java | 36 +++--- .../provisional/service/GDBRunControl.java | 21 ++-- 9 files changed, 139 insertions(+), 101 deletions(-) diff --git a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/actions/DsfResumeCommand.java b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/actions/DsfResumeCommand.java index 8f30f31bc0a..5784b917323 100644 --- a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/actions/DsfResumeCommand.java +++ b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/actions/DsfResumeCommand.java @@ -10,7 +10,9 @@ *******************************************************************************/ package org.eclipse.dd.dsf.debug.ui.actions; +import org.eclipse.dd.dsf.concurrent.DataRequestMonitor; import org.eclipse.dd.dsf.concurrent.DsfExecutor; +import org.eclipse.dd.dsf.concurrent.ImmediateExecutor; import org.eclipse.dd.dsf.concurrent.Immutable; import org.eclipse.dd.dsf.concurrent.RequestMonitor; import org.eclipse.dd.dsf.debug.internal.ui.DsfDebugUIPlugin; @@ -44,7 +46,15 @@ public class DsfResumeCommand implements IResumeHandler { fExecutor.submit(new DsfCommandRunnable(fTracker, request.getElements()[0], request) { @Override public void doExecute() { - request.setEnabled(getRunControl().canResume(getContext())); + getRunControl().canResume( + getContext(), + new DataRequestMonitor(ImmediateExecutor.getInstance(), null) { + @Override + protected void handleCompleted() { + request.setEnabled(isSuccess() && getData()); + request.done(); + } + }); } }); } diff --git a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/actions/DsfStepIntoCommand.java b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/actions/DsfStepIntoCommand.java index 52ce0cefcb6..d3c9e2a8aa5 100644 --- a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/actions/DsfStepIntoCommand.java +++ b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/actions/DsfStepIntoCommand.java @@ -10,7 +10,9 @@ *******************************************************************************/ package org.eclipse.dd.dsf.debug.ui.actions; +import org.eclipse.dd.dsf.concurrent.DataRequestMonitor; import org.eclipse.dd.dsf.concurrent.DsfExecutor; +import org.eclipse.dd.dsf.concurrent.ImmediateExecutor; import org.eclipse.dd.dsf.concurrent.Immutable; import org.eclipse.dd.dsf.debug.internal.ui.DsfDebugUIPlugin; import org.eclipse.dd.dsf.debug.service.IRunControl.StepType; @@ -44,7 +46,15 @@ public class DsfStepIntoCommand implements IStepIntoHandler { fExecutor.submit(new DsfCommandRunnable(fTracker, request.getElements()[0], request) { @Override public void doExecute() { - request.setEnabled(getStepQueueMgr().canEnqueueStep(getContext(), StepType.STEP_INTO)); + getStepQueueMgr().canEnqueueStep( + getContext(), StepType.STEP_INTO, + new DataRequestMonitor(ImmediateExecutor.getInstance(), null) { + @Override + protected void handleCompleted() { + request.setEnabled(isSuccess() && getData()); + request.done(); + } + }); } }); } diff --git a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/actions/DsfStepOverCommand.java b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/actions/DsfStepOverCommand.java index f4c2a28afa7..10ee48c77b5 100644 --- a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/actions/DsfStepOverCommand.java +++ b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/actions/DsfStepOverCommand.java @@ -10,7 +10,9 @@ *******************************************************************************/ package org.eclipse.dd.dsf.debug.ui.actions; +import org.eclipse.dd.dsf.concurrent.DataRequestMonitor; import org.eclipse.dd.dsf.concurrent.DsfExecutor; +import org.eclipse.dd.dsf.concurrent.ImmediateExecutor; import org.eclipse.dd.dsf.concurrent.Immutable; import org.eclipse.dd.dsf.debug.internal.ui.DsfDebugUIPlugin; import org.eclipse.dd.dsf.debug.service.IRunControl.StepType; @@ -44,7 +46,15 @@ public class DsfStepOverCommand implements IStepOverHandler { fExecutor.submit(new DsfCommandRunnable(fTracker, request.getElements()[0], request) { @Override public void doExecute() { - request.setEnabled(getStepQueueMgr().canEnqueueStep(getContext(), StepType.STEP_OVER)); + getStepQueueMgr().canEnqueueStep( + getContext(), StepType.STEP_OVER, + new DataRequestMonitor(ImmediateExecutor.getInstance(), null) { + @Override + protected void handleCompleted() { + request.setEnabled(isSuccess() && getData()); + request.done(); + } + }); } }); } diff --git a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/actions/DsfStepReturnCommand.java b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/actions/DsfStepReturnCommand.java index d3d9dc2d16b..91b0363bdd4 100644 --- a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/actions/DsfStepReturnCommand.java +++ b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/actions/DsfStepReturnCommand.java @@ -10,7 +10,9 @@ *******************************************************************************/ package org.eclipse.dd.dsf.debug.ui.actions; +import org.eclipse.dd.dsf.concurrent.DataRequestMonitor; import org.eclipse.dd.dsf.concurrent.DsfExecutor; +import org.eclipse.dd.dsf.concurrent.ImmediateExecutor; import org.eclipse.dd.dsf.concurrent.Immutable; import org.eclipse.dd.dsf.debug.internal.ui.DsfDebugUIPlugin; import org.eclipse.dd.dsf.debug.service.IRunControl.StepType; @@ -44,7 +46,15 @@ public class DsfStepReturnCommand implements IStepReturnHandler { fExecutor.submit(new DsfCommandRunnable(fTracker, request.getElements()[0], request) { @Override public void doExecute() { - request.setEnabled(getStepQueueMgr().canEnqueueStep(getContext(), StepType.STEP_RETURN)); + getStepQueueMgr().canEnqueueStep( + getContext(), StepType.STEP_RETURN, + new DataRequestMonitor(ImmediateExecutor.getInstance(), null) { + @Override + protected void handleCompleted() { + request.setEnabled(isSuccess() && getData()); + request.done(); + } + }); } }); } diff --git a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/actions/DsfSuspendCommand.java b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/actions/DsfSuspendCommand.java index 6f1a3e963ce..def744406e0 100644 --- a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/actions/DsfSuspendCommand.java +++ b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/actions/DsfSuspendCommand.java @@ -10,7 +10,9 @@ *******************************************************************************/ package org.eclipse.dd.dsf.debug.ui.actions; +import org.eclipse.dd.dsf.concurrent.DataRequestMonitor; import org.eclipse.dd.dsf.concurrent.DsfExecutor; +import org.eclipse.dd.dsf.concurrent.ImmediateExecutor; import org.eclipse.dd.dsf.concurrent.Immutable; import org.eclipse.dd.dsf.concurrent.RequestMonitor; import org.eclipse.dd.dsf.debug.internal.ui.DsfDebugUIPlugin; @@ -43,7 +45,15 @@ public class DsfSuspendCommand implements ISuspendHandler { fExecutor.submit(new DsfCommandRunnable(fTracker, request.getElements()[0], request) { @Override public void doExecute() { - request.setEnabled(getRunControl().canSuspend(getContext())); + getRunControl().canSuspend( + getContext(), + new DataRequestMonitor(ImmediateExecutor.getInstance(), null) { + @Override + protected void handleCompleted() { + request.setEnabled(isSuccess() && getData()); + request.done(); + } + }); } }); } diff --git a/plugins/org.eclipse.dd.dsf.debug/src/org/eclipse/dd/dsf/debug/service/IRunControl.java b/plugins/org.eclipse.dd.dsf.debug/src/org/eclipse/dd/dsf/debug/service/IRunControl.java index 3bbc4242275..82e36257fd6 100644 --- a/plugins/org.eclipse.dd.dsf.debug/src/org/eclipse/dd/dsf/debug/service/IRunControl.java +++ b/plugins/org.eclipse.dd.dsf.debug/src/org/eclipse/dd/dsf/debug/service/IRunControl.java @@ -115,15 +115,13 @@ public interface IRunControl extends IDMService * Run control commands. They all require the IExecutionContext object on * which they perform the operations. */ - boolean canResume(IExecutionDMContext context); - boolean canSuspend(IExecutionDMContext context); + void canResume(IExecutionDMContext context, DataRequestMonitor rm); + void canSuspend(IExecutionDMContext context, DataRequestMonitor rm); boolean isSuspended(IExecutionDMContext context); void resume(IExecutionDMContext context, RequestMonitor requestMonitor); void suspend(IExecutionDMContext context, RequestMonitor requestMonitor); - public enum StepType { STEP_OVER, STEP_INTO, STEP_RETURN }; + public enum StepType { STEP_OVER, STEP_INTO, STEP_RETURN, INSTRUCTION_STEP_OVER, INSTRUCTION_STEP_INTO, INSTRUCTION_STEP_RETUTRN }; boolean isStepping(IExecutionDMContext context); - boolean canStep(IExecutionDMContext context, StepType stepType); + void canStep(IExecutionDMContext context, StepType stepType, DataRequestMonitor rm); void step(IExecutionDMContext context, StepType stepType, RequestMonitor requestMonitor); - boolean canInstructionStep(IExecutionDMContext context, StepType stepType); - void instructionStep(IExecutionDMContext context, StepType stepType, RequestMonitor requestMonitor); } diff --git a/plugins/org.eclipse.dd.dsf.debug/src/org/eclipse/dd/dsf/debug/service/StepQueueManager.java b/plugins/org.eclipse.dd.dsf.debug/src/org/eclipse/dd/dsf/debug/service/StepQueueManager.java index 2fea35e74bd..47d91c5fc19 100644 --- a/plugins/org.eclipse.dd.dsf.debug/src/org/eclipse/dd/dsf/debug/service/StepQueueManager.java +++ b/plugins/org.eclipse.dd.dsf.debug/src/org/eclipse/dd/dsf/debug/service/StepQueueManager.java @@ -18,6 +18,7 @@ import java.util.Map; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; +import org.eclipse.dd.dsf.concurrent.DataRequestMonitor; import org.eclipse.dd.dsf.concurrent.DsfRunnable; import org.eclipse.dd.dsf.concurrent.RequestMonitor; import org.eclipse.dd.dsf.datamodel.IDMEvent; @@ -64,10 +65,8 @@ public class StepQueueManager extends AbstractDsfService private static class StepRequest { StepType fStepType; - boolean fIsInstructionStep; - StepRequest(StepType type, boolean instruction) { + StepRequest(StepType type) { fStepType = type; - fIsInstructionStep = instruction; } } @@ -116,17 +115,17 @@ public class StepQueueManager extends AbstractDsfService /** * Checks whether a step command can be queued up for given context. */ - public boolean canEnqueueStep(IExecutionDMContext execCtx, StepType stepType) { - return (fRunControl.isSuspended(execCtx) && fRunControl.canStep(execCtx, stepType)) || - (fRunControl.isStepping(execCtx) && !isSteppingTimedOut(execCtx)); + public void canEnqueueStep(IExecutionDMContext execCtx, StepType stepType, DataRequestMonitor rm) { + if (doCanEnqueueStep(execCtx, stepType)) { + rm.setData(true); + rm.done(); + } else { + fRunControl.canStep(execCtx, stepType, rm); + } } - /** - * Checks whether an instruction step command can be queued up for given context. - */ - public boolean canEnqueueInstructionStep(IExecutionDMContext execCtx, StepType stepType) { - return (fRunControl.isSuspended(execCtx) && fRunControl.canInstructionStep(execCtx, stepType)) || - (fRunControl.isStepping(execCtx) && !isSteppingTimedOut(execCtx)); + private boolean doCanEnqueueStep(IExecutionDMContext execCtx, StepType stepType) { + return fRunControl.isStepping(execCtx) && !isSteppingTimedOut(execCtx); } /** @@ -144,40 +143,25 @@ public class StepQueueManager extends AbstractDsfService * @param execCtx Execution context that should perform the step. * @param stepType Type of step to execute. */ - public void enqueueStep(IExecutionDMContext execCtx, StepType stepType) { - if (fRunControl.canStep(execCtx, stepType)) { - fRunControl.step(execCtx, stepType, new RequestMonitor(getExecutor(), null)); - } else if (canEnqueueStep(execCtx, stepType)) { - List stepQueue = fStepQueues.get(execCtx); - if (stepQueue == null) { - stepQueue = new LinkedList(); - fStepQueues.put(execCtx, stepQueue); - } - if (stepQueue.size() < fQueueDepth) { - stepQueue.add(new StepRequest(stepType, false)); - } - } - } - - /** - * Adds an instruction step command to the execution queue for given - * context. - * @param execCtx Execution context that should perform the step. - * @param stepType Type of step to execute. - */ - public void enqueueInstructionStep(IExecutionDMContext execCtx, StepType stepType) { - if (fRunControl.canInstructionStep(execCtx, stepType)) { - fRunControl.instructionStep(execCtx, stepType, new RequestMonitor(getExecutor(), null)); - } else if (canEnqueueInstructionStep(execCtx, stepType)) { - List stepQueue = fStepQueues.get(execCtx); - if (stepQueue == null) { - stepQueue = new LinkedList(); - fStepQueues.put(execCtx, stepQueue); - } - if (stepQueue.size() < fQueueDepth) { - stepQueue.add(new StepRequest(stepType, true)); - } - } + public void enqueueStep(final IExecutionDMContext execCtx, final StepType stepType) { + fRunControl.canStep( + execCtx, stepType, new DataRequestMonitor(getExecutor(), null) { + @Override + protected void handleCompleted() { + if (isSuccess() && getData()) { + fRunControl.step(execCtx, stepType, new RequestMonitor(getExecutor(), null)); + } else if (doCanEnqueueStep(execCtx, stepType)) { + List stepQueue = fStepQueues.get(execCtx); + if (stepQueue == null) { + stepQueue = new LinkedList(); + fStepQueues.put(execCtx, stepQueue); + } + if (stepQueue.size() < fQueueDepth) { + stepQueue.add(new StepRequest(stepType)); + } + } + } + }); } /** @@ -191,7 +175,7 @@ public class StepQueueManager extends AbstractDsfService /////////////////////////////////////////////////////////////////////////// @DsfServiceEventHandler - public void eventDispatched(ISuspendedDMEvent e) { + public void eventDispatched(final ISuspendedDMEvent e) { // Take care of the stepping time out fTimedOutFlags.remove(e.getDMContext()); ScheduledFuture future = fTimedOutFutures.remove(e.getDMContext()); @@ -200,26 +184,23 @@ public class StepQueueManager extends AbstractDsfService // Check if there's a step pending, if so execute it if (fStepQueues.containsKey(e.getDMContext())) { List queue = fStepQueues.get(e.getDMContext()); - StepRequest request = queue.remove(queue.size() - 1); + final StepRequest request = queue.remove(queue.size() - 1); if (queue.isEmpty()) fStepQueues.remove(e.getDMContext()); - if (request.fIsInstructionStep) { - if (fRunControl.canInstructionStep(e.getDMContext(), request.fStepType)) { - fRunControl.instructionStep( - e.getDMContext(), request.fStepType, new RequestMonitor(getExecutor(), null)); - } else { - // For whatever reason we can't step anymore, so clear out - // the step queue. - fStepQueues.remove(e.getDMContext()); - } - } else { - if (fRunControl.canStep(e.getDMContext(), request.fStepType)) { - fRunControl.step(e.getDMContext(), request.fStepType,new RequestMonitor(getExecutor(), null)); - } else { - // For whatever reason we can't step anymore, so clear out - // the step queue. - fStepQueues.remove(e.getDMContext()); - } - } + fRunControl.canStep( + e.getDMContext(), request.fStepType, + new DataRequestMonitor(getExecutor(), null) { + @Override + protected void handleCompleted() { + if (isSuccess() && getData()) { + fRunControl.step( + e.getDMContext(), request.fStepType, new RequestMonitor(getExecutor(), null)); + } else { + // For whatever reason we can't step anymore, so clear out + // the step queue. + fStepQueues.remove(e.getDMContext()); + } + } + }); } } diff --git a/plugins/org.eclipse.dd.examples.pda/src/org/eclipse/dd/examples/pda/service/PDARunControl.java b/plugins/org.eclipse.dd.examples.pda/src/org/eclipse/dd/examples/pda/service/PDARunControl.java index a9e70efc4d7..7d6fc93aff6 100644 --- a/plugins/org.eclipse.dd.examples.pda/src/org/eclipse/dd/examples/pda/service/PDARunControl.java +++ b/plugins/org.eclipse.dd.examples.pda/src/org/eclipse/dd/examples/pda/service/PDARunControl.java @@ -219,13 +219,23 @@ public class PDARunControl extends AbstractDsfService } - public boolean canResume(IExecutionDMContext context) { + public void canResume(IExecutionDMContext context, DataRequestMonitor rm) { + rm.setData(doCanResume(context)); + rm.done(); + } + + private boolean doCanResume(IExecutionDMContext context) { return isSuspended(context) && !fResumePending; - } + } - public boolean canSuspend(IExecutionDMContext context) { + public void canSuspend(IExecutionDMContext context, DataRequestMonitor rm) { + rm.setData(doCanSuspend(context)); + rm.done(); + } + + private boolean doCanSuspend(IExecutionDMContext context) { return !isSuspended(context); - } + } public boolean isSuspended(IExecutionDMContext context) { return fSuspended; @@ -238,7 +248,7 @@ public class PDARunControl extends AbstractDsfService public void resume(IExecutionDMContext context, final RequestMonitor rm) { assert context != null; - if (canResume(context)) { + if (doCanResume(context)) { fResumePending = true; fCommandControl.queueCommand( new PDAResumeCommand(fCommandControl.getProgramDMContext()), @@ -260,7 +270,7 @@ public class PDARunControl extends AbstractDsfService public void suspend(IExecutionDMContext context, final RequestMonitor rm){ assert context != null; - if (canSuspend(context)) { + if (doCanSuspend(context)) { fCommandControl.queueCommand( new PDASuspendCommand(fCommandControl.getProgramDMContext()), new DataRequestMonitor(getExecutor(), rm)); @@ -270,14 +280,14 @@ public class PDARunControl extends AbstractDsfService } } - public boolean canStep(IExecutionDMContext context, StepType stepType) { - return canResume(context); + public void canStep(IExecutionDMContext context, StepType stepType, DataRequestMonitor rm) { + canResume(context, rm); } public void step(IExecutionDMContext context, StepType stepType, final RequestMonitor rm) { assert context != null; - if (canResume(context)) { + if (doCanResume(context)) { fResumePending = true; fStepping = true; @@ -299,14 +309,6 @@ public class PDARunControl extends AbstractDsfService } } - public boolean canInstructionStep(IExecutionDMContext context, StepType stepType) { - return false; - } - - public void instructionStep(IExecutionDMContext context, StepType stepType, RequestMonitor rm) { - PDAPlugin.failRequest(rm, NOT_SUPPORTED, "Operation not implemented"); - } - public void getExecutionContexts(final IContainerDMContext containerDmc, final DataRequestMonitor rm) { PDAPlugin.failRequest(rm, NOT_SUPPORTED, "Operation not implemented"); } diff --git a/plugins/org.eclipse.dd.gdb/src/org/eclipse/dd/gdb/internal/provisional/service/GDBRunControl.java b/plugins/org.eclipse.dd.gdb/src/org/eclipse/dd/gdb/internal/provisional/service/GDBRunControl.java index 2ff88c4205a..b658d8774c1 100644 --- a/plugins/org.eclipse.dd.gdb/src/org/eclipse/dd/gdb/internal/provisional/service/GDBRunControl.java +++ b/plugins/org.eclipse.dd.gdb/src/org/eclipse/dd/gdb/internal/provisional/service/GDBRunControl.java @@ -110,13 +110,20 @@ public class GDBRunControl extends MIRunControl { } @Override - public void suspend(IExecutionDMContext context, RequestMonitor requestMonitor){ - if (canSuspend(context)) { - fGdb.interrupt(); - } else { - requestMonitor.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, INVALID_STATE, "Context cannot be suspended.", null)); //$NON-NLS-1$ - } - requestMonitor.done(); + public void suspend(IExecutionDMContext context, final RequestMonitor rm){ + canSuspend( + context, + new DataRequestMonitor(getExecutor(), rm) { + @Override + protected void handleSuccess() { + if (getData()) { + fGdb.interrupt(); + } else { + rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, INVALID_STATE, "Context cannot be suspended.", null)); //$NON-NLS-1$ + } + rm.done(); + } + }); }