From c604aca167691717490c76dc8943e1485bf4f3a4 Mon Sep 17 00:00:00 2001 From: Pawel Piech Date: Thu, 22 May 2008 04:56:38 +0000 Subject: [PATCH] [233338] - [concurrency] RequestMonitor.isSuccess() is inconsistent with getStatus(). --- .../dd/dsf/ui/concurrent/ViewerCountingRequestMonitor.java | 5 ++++- .../eclipse/dd/dsf/concurrent/CountingRequestMonitor.java | 5 ++--- .../org/eclipse/dd/dsf/concurrent/MultiRequestMonitor.java | 6 ++++-- .../src/org/eclipse/dd/dsf/concurrent/RequestMonitor.java | 3 +++ 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/concurrent/ViewerCountingRequestMonitor.java b/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/concurrent/ViewerCountingRequestMonitor.java index 62b723df076..b4f52c3bf9c 100644 --- a/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/concurrent/ViewerCountingRequestMonitor.java +++ b/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/concurrent/ViewerCountingRequestMonitor.java @@ -33,7 +33,10 @@ public class ViewerCountingRequestMonitor extends CountingRequestMonitor { @Override public synchronized boolean isCanceled() { - return fUpdate.isCanceled() || super.isCanceled(); + // isCanceled() is called implicitly by the super-constructor before fUpdate + // is initialized. The fUpdate != null is here to protect against an NPE + // from that. + return (fUpdate != null && fUpdate.isCanceled()) || super.isCanceled(); } @Override diff --git a/plugins/org.eclipse.dd.dsf/src/org/eclipse/dd/dsf/concurrent/CountingRequestMonitor.java b/plugins/org.eclipse.dd.dsf/src/org/eclipse/dd/dsf/concurrent/CountingRequestMonitor.java index e00a3f19206..f44b2a5d4e7 100644 --- a/plugins/org.eclipse.dd.dsf/src/org/eclipse/dd/dsf/concurrent/CountingRequestMonitor.java +++ b/plugins/org.eclipse.dd.dsf/src/org/eclipse/dd/dsf/concurrent/CountingRequestMonitor.java @@ -92,9 +92,8 @@ public class CountingRequestMonitor extends RequestMonitor { @Override public synchronized void setStatus(IStatus status) { - if (!(getStatus() instanceof MultiStatus)) { - super.setStatus(new MultiStatus(DsfPlugin.PLUGIN_ID, 0, "Combined status of multiple asynchronous operations", null)); //$NON-NLS-1$ + if ((getStatus() instanceof MultiStatus)) { + ((MultiStatus)getStatus()).add(status); } - ((MultiStatus)getStatus()).add(status); }; } diff --git a/plugins/org.eclipse.dd.dsf/src/org/eclipse/dd/dsf/concurrent/MultiRequestMonitor.java b/plugins/org.eclipse.dd.dsf/src/org/eclipse/dd/dsf/concurrent/MultiRequestMonitor.java index 807decdbf25..4edb614f408 100644 --- a/plugins/org.eclipse.dd.dsf/src/org/eclipse/dd/dsf/concurrent/MultiRequestMonitor.java +++ b/plugins/org.eclipse.dd.dsf/src/org/eclipse/dd/dsf/concurrent/MultiRequestMonitor.java @@ -73,8 +73,10 @@ public class MultiRequestMonitor extends RequestMonito *
* @param requestMonitor */ - public void requestMonitorDone(V requestMonitor) { - ((MultiStatus)getStatus()).merge(requestMonitor.getStatus()); + public synchronized void requestMonitorDone(V requestMonitor) { + if (getStatus() instanceof MultiStatus) { + ((MultiStatus)getStatus()).merge(requestMonitor.getStatus()); + } assert fStatusMap.containsKey(requestMonitor); fStatusMap.put(requestMonitor, true); assert fDoneCounter > 0; diff --git a/plugins/org.eclipse.dd.dsf/src/org/eclipse/dd/dsf/concurrent/RequestMonitor.java b/plugins/org.eclipse.dd.dsf/src/org/eclipse/dd/dsf/concurrent/RequestMonitor.java index dd3edd52ef9..7b9dd17df67 100644 --- a/plugins/org.eclipse.dd.dsf/src/org/eclipse/dd/dsf/concurrent/RequestMonitor.java +++ b/plugins/org.eclipse.dd.dsf/src/org/eclipse/dd/dsf/concurrent/RequestMonitor.java @@ -143,6 +143,9 @@ public class RequestMonitor { /** Returns the status of the completed method. */ public synchronized IStatus getStatus() { + if (isCanceled()) { + return Status.CANCEL_STATUS; + } return fStatus; }