From 94e7e1504c3a9d508ff736eda622e6fc525fdf0c Mon Sep 17 00:00:00 2001 From: Pawel Piech Date: Wed, 7 Oct 2009 18:03:13 +0000 Subject: [PATCH] Bug 291423 - [debug view] RejectedExecutionException when stepping fast past end of program. --- .../ui/actions/DsfTerminateCommand.java | 64 ++++++++++++------- .../launch/AbstractLaunchVMProvider.java | 38 +++++------ 2 files changed, 61 insertions(+), 41 deletions(-) diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/actions/DsfTerminateCommand.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/actions/DsfTerminateCommand.java index bf600ec3346..a13b2d37d42 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/actions/DsfTerminateCommand.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/actions/DsfTerminateCommand.java @@ -11,8 +11,11 @@ *******************************************************************************/ package org.eclipse.cdt.dsf.gdb.internal.ui.actions; +import java.util.concurrent.RejectedExecutionException; + import org.eclipse.cdt.dsf.concurrent.DsfExecutor; import org.eclipse.cdt.dsf.concurrent.DsfRunnable; +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.debug.service.IRunControl.IExecutionDMContext; @@ -61,22 +64,27 @@ public class DsfTerminateCommand implements ITerminateHandler { return; } - fExecutor.execute( - new DsfRunnable() { - public void run() { - // Get the processes service and the exec context. - IGDBBackend gdbBackend = fTracker.getService(IGDBBackend.class); - if (gdbBackend == null || dmc == null) { - // Context or service already invalid. - request.setEnabled(false); - request.done(); - } else { - // Check the terminate. - request.setEnabled(gdbBackend.getState() == IMIBackend.State.STARTED); - request.done(); + try { + fExecutor.execute( + new DsfRunnable() { + public void run() { + // Get the processes service and the exec context. + IGDBBackend gdbBackend = fTracker.getService(IGDBBackend.class); + if (gdbBackend == null || dmc == null) { + // Context or service already invalid. + request.setEnabled(false); + request.done(); + } else { + // Check the terminate. + request.setEnabled(gdbBackend.getState() == IMIBackend.State.STARTED); + request.done(); + } } - } - }); + }); + } catch (RejectedExecutionException e) { + request.setEnabled(false); + request.done(); + } } public boolean execute(final IDebugCommandRequest request) { @@ -85,14 +93,24 @@ public class DsfTerminateCommand implements ITerminateHandler { return false; } - fExecutor.submit(new DsfCommandRunnable(fTracker, request.getElements()[0], request) { - @Override public void doExecute() { - IGDBControl gdbControl = fTracker.getService(IGDBControl.class); - if (gdbControl != null) { - gdbControl.terminate(new RequestMonitor(fExecutor, null)); - } - } - }); + try { + fExecutor.submit(new DsfCommandRunnable(fTracker, request.getElements()[0], request) { + @Override public void doExecute() { + IGDBControl gdbControl = fTracker.getService(IGDBControl.class); + if (gdbControl != null) { + gdbControl.terminate(new RequestMonitor(ImmediateExecutor.getInstance(), null) { + @Override + protected void handleCompleted() { + request.setStatus(getStatus()); + request.done(); + }; + }); + } + } + }); + } catch (RejectedExecutionException e) { + request.done(); + } return false; } diff --git a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/ui/viewmodel/launch/AbstractLaunchVMProvider.java b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/ui/viewmodel/launch/AbstractLaunchVMProvider.java index 1c665f2da8f..d0565c8020c 100644 --- a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/ui/viewmodel/launch/AbstractLaunchVMProvider.java +++ b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/ui/viewmodel/launch/AbstractLaunchVMProvider.java @@ -164,24 +164,26 @@ public class AbstractLaunchVMProvider extends AbstractDMVMProvider refreshStackFramesFuture.cancel(false); } - refreshStackFramesFuture = getSession().getExecutor().schedule( - new DsfRunnable() { - public void run() { - if (getSession().isActive()) { - getExecutor().execute(new Runnable() { - public void run() { - // trigger full stack frame update - ScheduledFuture future= fRefreshStackFramesFutures.get(exeContext); - if (future != null && !isDisposed()) { - fRefreshStackFramesFutures.remove(exeContext); - handleEvent(new FullStackRefreshEvent(exeContext), null); - } - }}); - } - } - }, - FRAME_UPDATE_DELAY, TimeUnit.MILLISECONDS); - fRefreshStackFramesFutures.put(exeContext, refreshStackFramesFuture); + try { + refreshStackFramesFuture = getSession().getExecutor().schedule( + new DsfRunnable() { + public void run() { + if (getSession().isActive()) { + getExecutor().execute(new Runnable() { + public void run() { + // trigger full stack frame update + ScheduledFuture future= fRefreshStackFramesFutures.get(exeContext); + if (future != null && !isDisposed()) { + fRefreshStackFramesFutures.remove(exeContext); + handleEvent(new FullStackRefreshEvent(exeContext), null); + } + }}); + } + } + }, + FRAME_UPDATE_DELAY, TimeUnit.MILLISECONDS); + fRefreshStackFramesFutures.put(exeContext, refreshStackFramesFuture); + } catch (RejectedExecutionException e) {} } else if (event instanceof IRunControl.IResumedDMEvent) { IExecutionDMContext exeContext= ((IRunControl.IResumedDMEvent) event).getDMContext(); ScheduledFuture refreshStackFramesFuture= fRefreshStackFramesFutures.get(exeContext);