From cfe2a71e89334220130b989966264fd1ee1f4e9f Mon Sep 17 00:00:00 2001 From: Pawel Piech Date: Tue, 9 Sep 2008 20:59:09 +0000 Subject: [PATCH] [246789] - [concurrent] Sequence.cancel() can trigger an assertion error in RequestMonitor --- .../eclipse/dd/dsf/concurrent/Sequence.java | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/plugins/org.eclipse.dd.dsf/src/org/eclipse/dd/dsf/concurrent/Sequence.java b/plugins/org.eclipse.dd.dsf/src/org/eclipse/dd/dsf/concurrent/Sequence.java index 0744c3143f4..de7bd632bf3 100644 --- a/plugins/org.eclipse.dd.dsf/src/org/eclipse/dd/dsf/concurrent/Sequence.java +++ b/plugins/org.eclipse.dd.dsf/src/org/eclipse/dd/dsf/concurrent/Sequence.java @@ -23,6 +23,7 @@ import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.MultiStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Status; +import org.eclipse.dd.dsf.concurrent.RequestMonitor.ICanceledListener; import org.eclipse.dd.dsf.internal.DsfPlugin; /** @@ -153,6 +154,12 @@ abstract public class Sequence extends DsfRunnable implements Future { fTaskName = taskName; fRollbackTaskName = rollbackTaskName; fRequestMonitor = rm; + + fRequestMonitor.addCancelListener(new ICanceledListener() { + public void requestCanceled(RequestMonitor rm) { + fSync.doCancel(); + } + }); } /** @@ -198,9 +205,20 @@ abstract public class Sequence extends DsfRunnable implements Future { /** * Don't try to interrupt the DSF executor thread, just ignore the request * if set. + *

If a request monitor was specified when creating a sequence, that + * request monitor will be canceled by this method as well. The client + * can also use the request monitor's cancel method to cancel the sequence. + * + * @see RequestMonitor#cancel() */ public boolean cancel(boolean mayInterruptIfRunning) { - return fSync.doCancel(); + // Cancel the request monitor first, to avoid a situation where + // the request monitor is not canceled but the status is set + // to canceled. + if (fRequestMonitor != null) { + fRequestMonitor.cancel(); + } + return fSync.doCancel(); } public boolean isCancelled() { return fSync.doIsCancelled(); }