diff options
author | Pawel Piech | 2010-05-14 16:50:40 +0000 |
---|---|---|
committer | Pawel Piech | 2010-05-14 16:50:40 +0000 |
commit | 06e479681f0a3dc7582cab9ef5cc420b353cfa8f (patch) | |
tree | a2a5eb44ebca663dc809570d5db26c72ec1734de /dsf | |
parent | 1c2aa84166c0b1fff583f03b886fd7fb15688e13 (diff) | |
download | org.eclipse.cdt-06e479681f0a3dc7582cab9ef5cc420b353cfa8f.tar.gz org.eclipse.cdt-06e479681f0a3dc7582cab9ef5cc420b353cfa8f.tar.xz org.eclipse.cdt-06e479681f0a3dc7582cab9ef5cc420b353cfa8f.zip |
Bug 312813 - [Launch] MIInferiorProcess.exitValue() never returns
Diffstat (limited to 'dsf')
7 files changed, 39 insertions, 15 deletions
diff --git a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/viewmodel/DsfCastToTypeSupport.java b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/viewmodel/DsfCastToTypeSupport.java index d91bd6de933..c6b2b2246e0 100644 --- a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/viewmodel/DsfCastToTypeSupport.java +++ b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/viewmodel/DsfCastToTypeSupport.java @@ -75,7 +75,7 @@ public class DsfCastToTypeSupport { final DsfSession session = DsfSession.getSession( dmvmProvider.getSession().getId()); if (session == null) { - cancel(false); + rm.setStatus(new Status(IStatus.ERROR, DsfUIPlugin.PLUGIN_ID, IDsfStatusConstants.INVALID_STATE, "Debug session already shut down.", null)); //$NON-NLS-1$ rm.done(); return; } diff --git a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/ui/viewmodel/modules/detail/ModuleDetailPane.java b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/ui/viewmodel/modules/detail/ModuleDetailPane.java index bab51b5a67f..4655fe16353 100644 --- a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/ui/viewmodel/modules/detail/ModuleDetailPane.java +++ b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/ui/viewmodel/modules/detail/ModuleDetailPane.java @@ -483,7 +483,8 @@ public class ModuleDetailPane extends ModulesAbstractDetailPane implements IAdap */ final DsfSession session = DsfSession.getSession(fDmc.getSessionId()); if (session == null) { - cancel(false); + rm.setStatus(new Status(IStatus.ERROR, DsfUIPlugin.PLUGIN_ID, IDsfStatusConstants.INVALID_STATE, "Debug session already shut down.", null)); //$NON-NLS-1$ + rm.done(); return; } @@ -506,7 +507,8 @@ public class ModuleDetailPane extends ModulesAbstractDetailPane implements IAdap * We're in another dispatch, so we must guard against executor shutdown again. */ if (!DsfSession.isSessionActive(session.getId())) { - GetModuleDetailsQuery.this.cancel(false); + rm.setStatus(new Status(IStatus.ERROR, DsfUIPlugin.PLUGIN_ID, IDsfStatusConstants.INVALID_STATE, "Debug session already shut down.", null)); //$NON-NLS-1$ + rm.done(); return; } super.handleCompleted(); diff --git a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/ui/viewmodel/register/SyncRegisterDataAccess.java b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/ui/viewmodel/register/SyncRegisterDataAccess.java index bca7931582b..b3378b8e713 100644 --- a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/ui/viewmodel/register/SyncRegisterDataAccess.java +++ b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/ui/viewmodel/register/SyncRegisterDataAccess.java @@ -21,10 +21,10 @@ import org.eclipse.cdt.dsf.concurrent.ThreadSafe; import org.eclipse.cdt.dsf.concurrent.ThreadSafeAndProhibitedFromDsfExecutor; import org.eclipse.cdt.dsf.datamodel.DMContexts; import org.eclipse.cdt.dsf.datamodel.IDMContext; -import org.eclipse.cdt.dsf.debug.service.IRegisters; import org.eclipse.cdt.dsf.debug.service.IFormattedValues.FormattedValueDMContext; import org.eclipse.cdt.dsf.debug.service.IFormattedValues.FormattedValueDMData; import org.eclipse.cdt.dsf.debug.service.IFormattedValues.IFormattedDataDMContext; +import org.eclipse.cdt.dsf.debug.service.IRegisters; import org.eclipse.cdt.dsf.debug.service.IRegisters.IBitFieldDMContext; import org.eclipse.cdt.dsf.debug.service.IRegisters.IBitFieldDMData; import org.eclipse.cdt.dsf.debug.service.IRegisters.IMnemonic; @@ -60,7 +60,7 @@ public class SyncRegisterDataAccess { */ final DsfSession session = DsfSession.getSession(fDmc.getSessionId()); if (session == null) { - cancel(false); + rm.setStatus(new Status(IStatus.ERROR, DsfUIPlugin.PLUGIN_ID, IDsfStatusConstants.INVALID_STATE, "Debug session already shut down.", null)); //$NON-NLS-1$ rm.done(); return; } diff --git a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/ui/viewmodel/variable/SyncVariableDataAccess.java b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/ui/viewmodel/variable/SyncVariableDataAccess.java index 260a2ac412c..9911831dcf0 100644 --- a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/ui/viewmodel/variable/SyncVariableDataAccess.java +++ b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/ui/viewmodel/variable/SyncVariableDataAccess.java @@ -118,7 +118,7 @@ public class SyncVariableDataAccess { */ final DsfSession session = DsfSession.getSession(fDmc.getSessionId()); if (session == null) { - cancel(false); + rm.setStatus(new Status(IStatus.ERROR, DsfUIPlugin.PLUGIN_ID, IDsfStatusConstants.INVALID_STATE, "Debug session already shut down.", null)); //$NON-NLS-1$ rm.done(); return; } @@ -204,7 +204,7 @@ public class SyncVariableDataAccess { */ final DsfSession session = DsfSession.getSession(fDmc.getSessionId()); if (session == null) { - cancel(false); + rm.setStatus(new Status(IStatus.ERROR, DsfUIPlugin.PLUGIN_ID, IDsfStatusConstants.INVALID_STATE, "Debug session already shut down.", null)); //$NON-NLS-1$ rm.done(); return; } @@ -302,7 +302,7 @@ public class SyncVariableDataAccess { */ final DsfSession session = DsfSession.getSession(fDmc.getSessionId()); if (session == null) { - cancel(false); + rm.setStatus(new Status(IStatus.ERROR, DsfUIPlugin.PLUGIN_ID, IDsfStatusConstants.INVALID_STATE, "Debug session already shut down.", null)); //$NON-NLS-1$ rm.done(); return; } @@ -395,7 +395,7 @@ public class SyncVariableDataAccess { */ final DsfSession session = DsfSession.getSession(fDmc.getSessionId()); if (session == null) { - cancel(false); + rm.setStatus(new Status(IStatus.ERROR, DsfUIPlugin.PLUGIN_ID, IDsfStatusConstants.INVALID_STATE, "Debug session already shut down.", null)); //$NON-NLS-1$ rm.done(); return; } @@ -488,7 +488,7 @@ public class SyncVariableDataAccess { */ final DsfSession session = DsfSession.getSession(fDmc.getSessionId()); if (session == null) { - cancel(false); + rm.setStatus(new Status(IStatus.ERROR, DsfUIPlugin.PLUGIN_ID, IDsfStatusConstants.INVALID_STATE, "Debug session already shut down.", null)); //$NON-NLS-1$ rm.done(); return; } diff --git a/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/concurrent/Query.java b/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/concurrent/Query.java index 84165307078..69fceb597c0 100644 --- a/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/concurrent/Query.java +++ b/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/concurrent/Query.java @@ -152,6 +152,7 @@ abstract public class Query<V> extends DsfRunnable completed = fRm.isCompleted(); if (!completed) { fRm.cancel(); + fRm.notifyAll(); } } return !completed; @@ -161,7 +162,8 @@ abstract public class Query<V> extends DsfRunnable public boolean isDone() { synchronized (fRm) { - return fRm.isCompleted() || (fRm.isCanceled() && !fRm.isExecuted()); + // If future is canceled, return right away. + return fRm.isCompleted() || fRm.isCanceled(); } } @@ -180,6 +182,7 @@ abstract public class Query<V> extends DsfRunnable * @deprecated Query implementations should call the request monitor to * set the exception status directly. */ + @Deprecated protected void doneException(Throwable t) { fRm.setStatus(new Status(IStatus.ERROR, DsfPlugin.PLUGIN_ID, IDsfStatusConstants.INTERNAL_ERROR, "Exception", t)); //$NON-NLS-1$ fRm.done(); diff --git a/dsf/org.eclipse.cdt.examples.dsf/src/org/eclipse/cdt/examples/dsf/timers/TriggerCellModifier.java b/dsf/org.eclipse.cdt.examples.dsf/src/org/eclipse/cdt/examples/dsf/timers/TriggerCellModifier.java index b7de00a0ca4..d6d2e2f9776 100644 --- a/dsf/org.eclipse.cdt.examples.dsf/src/org/eclipse/cdt/examples/dsf/timers/TriggerCellModifier.java +++ b/dsf/org.eclipse.cdt.examples.dsf/src/org/eclipse/cdt/examples/dsf/timers/TriggerCellModifier.java @@ -193,7 +193,8 @@ public class TriggerCellModifier implements ICellModifier { // In that case, cancel to notify waiting thread. final DsfSession session = DsfSession.getSession(fDmc.getSessionId()); if (session == null) { - cancel(false); + rm.setStatus(new Status(IStatus.ERROR, DsfExamplesPlugin.PLUGIN_ID, IDsfStatusConstants.INVALID_STATE, "Debug session already shut down.", null)); //$NON-NLS-1$ + rm.done(); return; } @@ -234,7 +235,8 @@ public class TriggerCellModifier implements ICellModifier { // Guard against terminated session final DsfSession session = DsfSession.getSession(fDmc.getSessionId()); if (session == null) { - cancel(false); + rm.setStatus(new Status(IStatus.ERROR, DsfExamplesPlugin.PLUGIN_ID, IDsfStatusConstants.INVALID_STATE, "Debug session already shut down.", null)); //$NON-NLS-1$ + rm.done(); return; } diff --git a/dsf/org.eclipse.cdt.tests.dsf/src/org/eclipse/cdt/tests/dsf/concurrent/DsfQueryTests.java b/dsf/org.eclipse.cdt.tests.dsf/src/org/eclipse/cdt/tests/dsf/concurrent/DsfQueryTests.java index 7da7f99aea4..5e74eaf0417 100644 --- a/dsf/org.eclipse.cdt.tests.dsf/src/org/eclipse/cdt/tests/dsf/concurrent/DsfQueryTests.java +++ b/dsf/org.eclipse.cdt.tests.dsf/src/org/eclipse/cdt/tests/dsf/concurrent/DsfQueryTests.java @@ -110,6 +110,7 @@ public class DsfQueryTests { @Test public void doneExceptionTest() throws InterruptedException, ExecutionException { Query<Integer> q = new Query<Integer>() { + @SuppressWarnings("deprecation") @Override protected void execute(DataRequestMonitor<Integer> rm) { doneException(new Throwable()); @@ -246,12 +247,26 @@ public class DsfQueryTests { Assert.assertTrue(cancelCalled[0]); Assert.assertTrue(rmHolder[0].isCanceled()); Assert.assertTrue(q.isCancelled()); - Assert.assertFalse(q.isDone()); + Assert.assertTrue(q.isDone()); + + // Retrieve data + try { + q.get(); + } catch (CancellationException e) { + return; // Success + } finally { + Assert.assertTrue(q.isDone()); + Assert.assertTrue(q.isCancelled()); + } // Complete rm and query. + @SuppressWarnings("unchecked") + DataRequestMonitor<Integer> drm = (DataRequestMonitor<Integer>)rmHolder[0]; + drm.setData(new Integer(1)); rmHolder[0].done(); - // Retrieve data + // Try to retrieve data again, it should still result in + // cancellation exception. try { q.get(); } catch (CancellationException e) { @@ -260,6 +275,8 @@ public class DsfQueryTests { Assert.assertTrue(q.isDone()); Assert.assertTrue(q.isCancelled()); } + + Assert.assertTrue("CancellationException should have been thrown", false); //$NON-NLS-1$ } |