From 5fa5ff3a8138a7f90645a606e35e7a6695fad5c6 Mon Sep 17 00:00:00 2001 From: John Cortell Date: Wed, 10 Nov 2010 16:47:55 +0000 Subject: Bug 329481: Inconsistency in DSF ACPM cancel behavior. --- .../eclipse/cdt/dsf/concurrent/AbstractCache.java | 2 +- .../eclipse/cdt/dsf/concurrent/RequestCache.java | 22 ++++++++++------------ 2 files changed, 11 insertions(+), 13 deletions(-) (limited to 'dsf/org.eclipse.cdt.dsf') diff --git a/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/concurrent/AbstractCache.java b/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/concurrent/AbstractCache.java index e6985ea6bf..e4ad222a07 100644 --- a/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/concurrent/AbstractCache.java +++ b/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/concurrent/AbstractCache.java @@ -37,7 +37,7 @@ public abstract class AbstractCache implements ICache { private class RequestCanceledListener implements RequestMonitor.ICanceledListener { public void requestCanceled(final RequestMonitor canceledRm) { - fExecutor.execute(new Runnable() { + fExecutor.getDsfExecutor().execute(new Runnable() { public void run() { handleCanceledRm(canceledRm); } diff --git a/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/concurrent/RequestCache.java b/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/concurrent/RequestCache.java index dbf8f669b3..76b94d6e14 100644 --- a/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/concurrent/RequestCache.java +++ b/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/concurrent/RequestCache.java @@ -12,7 +12,6 @@ package org.eclipse.cdt.dsf.concurrent; *******************************************************************************/ import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; /** * A general purpose cache, which caches the result of a single request. @@ -46,25 +45,24 @@ public abstract class RequestCache extends AbstractCache { fRm = new DataRequestMonitor(getImmediateInDsfExecutor(), null) { - private IStatus fRawStatus = Status.OK_STATUS; - @Override protected void handleCompleted() { if (this == fRm) { fRm = null; - IStatus status; - synchronized (this) { - status = fRawStatus; + // If the requestor canceled the request, then leave the + // cache as is, regardless of how the retrieval completes. + // We want the cache to stay in the invalid state so that + // it remains functional. The request may have completed + // successfully, and it may be tempting to use the result in + // that case, but that opens up a can of worms. We'll follow + // the behavior in RequestMonitor: when an RM is canceled, + // it's canceled; period. + if (!isCanceled()) { + set(getData(), getStatus()); } - set(getData(), status); } } - @Override - public synchronized void setStatus(IStatus status) { - fRawStatus = status; - }; - @Override public boolean isCanceled() { return super.isCanceled() || RequestCache.this.isCanceled(); -- cgit v1.2.1