From 17fe60355e7b2979e23206fd43242ecd0905c08f Mon Sep 17 00:00:00 2001 From: Pawel Piech Date: Thu, 1 Oct 2009 18:44:36 +0000 Subject: [PATCH] Bug 291086 - [vm] AbstractVMProvider.handleEvent() should honor request monitor's cancel request. --- .../dsf/ui/viewmodel/AbstractVMProvider.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/ui/viewmodel/AbstractVMProvider.java b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/ui/viewmodel/AbstractVMProvider.java index f1c77db46b1..d41884194f4 100644 --- a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/ui/viewmodel/AbstractVMProvider.java +++ b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/ui/viewmodel/AbstractVMProvider.java @@ -327,9 +327,13 @@ abstract public class AbstractVMProvider implements IVMProvider, IVMEventListene // that should be handled. If there are, doHandleEvent calls itself // to process the next event in the queue. assert queue.fCurrentEvent == null && queue.fCurrentRm == null; - - queue.fCurrentEvent = eventInfo; - queue.fCurrentRm = new RequestMonitor(getExecutor(), null) { + + // We intentionally do not give the client RM as the parent RM + // for the queue.fCurrentRm. This is because fCurrentRm may get + // canceled if a new event comes and overrides it. If client RM + // was the parent, it would lead to the inconsistent situation where + // a sub-RM is canceled but the parent is not. + final RequestMonitor queueRm = new RequestMonitor(getExecutor(), null) { @Override protected void handleCompleted() { eventInfo.fClientRm.done(); @@ -341,6 +345,14 @@ abstract public class AbstractVMProvider implements IVMProvider, IVMEventListene } } }; + eventInfo.fClientRm.addCancelListener(new ICanceledListener() { + public void requestCanceled(RequestMonitor rm) { + queueRm.cancel(); + } + }) + + queue.fCurrentEvent = eventInfo; + queue.fCurrentRm = queueRm; handleEvent(proxyStrategy, eventInfo.fEvent, queue.fCurrentRm); }