From 8c148855bf9784dcd127b8bc0e7aca7d746f51d7 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Fri, 29 Aug 2014 07:37:33 +0200 Subject: [PATCH] Bug 442794: Speed up cancellation of PDOMIndexerJob.ProgressUpdateJob. --- .../internal/core/pdom/PDOMIndexerJob.java | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMIndexerJob.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMIndexerJob.java index 2e6f88f6da9..502b24fbec4 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMIndexerJob.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMIndexerJob.java @@ -30,7 +30,7 @@ public class PDOMIndexerJob extends Job { * Job updating the progress monitor of the indexer job. */ final class ProgressUpdateJob extends Job { - private boolean fStopped; + private boolean fCancelled; private ProgressUpdateJob() { super(CCorePlugin.getResourceString("PDOMIndexerJob.updateMonitorJob")); //$NON-NLS-1$ @@ -40,16 +40,28 @@ public class PDOMIndexerJob extends Job { @Override protected IStatus run(IProgressMonitor m) { int currentTick= 0; - while (!fStopped && !m.isCanceled()) { + while (!fCancelled && !m.isCanceled()) { currentTick= pdomManager.getMonitorMessage(PDOMIndexerJob.this, currentTick, TOTAL_MONITOR_WORK); try { - Thread.sleep(PROGRESS_UPDATE_INTERVAL); + synchronized(this) { + if (fCancelled) + break; + wait(PROGRESS_UPDATE_INTERVAL); + } } catch (InterruptedException e) { return Status.CANCEL_STATUS; } } return Status.OK_STATUS; } + @Override + protected void canceling() { + // Speed up cancellation by notifying the waiting thread. + synchronized(this) { + fCancelled= true; + notify(); + } + } } private static final int PROGRESS_UPDATE_INTERVAL = 500; @@ -59,7 +71,7 @@ public class PDOMIndexerJob extends Job { private final PDOMManager pdomManager; private IPDOMIndexerTask currentTask; private boolean cancelledByManager= false; - private Object taskMutex = new Object(); + private final Object taskMutex = new Object(); private IProgressMonitor fMonitor; private final boolean fShowActivity;