diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/util/Canceler.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/util/Canceler.java index 0e2bd86ec1d..6749c0d13a8 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/util/Canceler.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/util/Canceler.java @@ -5,29 +5,44 @@ package org.eclipse.cdt.internal.core.util; */ public class Canceler implements ICanceler { private ICancelable fCancelable; - private boolean canceled; + private volatile boolean canceled; @Override - public synchronized void setCancelable(ICancelable cancelable) { - fCancelable= cancelable; - checkCanceled(); + public void setCancelable(ICancelable cancelable) { + synchronized (this) { + fCancelable= cancelable; + cancelable = getCancelableToCancel(); + } + if (cancelable != null) + cancelable.cancel(); } @Override - public synchronized void setCanceled(boolean canceled) { - this.canceled = canceled; - checkCanceled(); + public void setCanceled(boolean canceled) { + ICancelable cancelable; + synchronized (this) { + this.canceled = canceled; + cancelable = getCancelableToCancel(); + } + if (cancelable != null) + cancelable.cancel(); } @Override - public synchronized boolean isCanceled() { + public boolean isCanceled() { return canceled; } - private synchronized void checkCanceled() { - if (fCancelable != null && canceled) { - fCancelable.cancel(); + /** + * Returns the cancelable to cancel, or {@code null} if there is nothing to cancel. + * Sets {@link #fCancelable} to {@code null}. Has to be called from a synchronized block. + */ + private ICancelable getCancelableToCancel() { + ICancelable cancelable = null; + if (canceled) { + cancelable = fCancelable; fCancelable= null; } + return cancelable; } } \ No newline at end of file diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMWriter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMWriter.java index c2aed92bfae..844a33faffe 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMWriter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMWriter.java @@ -333,6 +333,7 @@ public abstract class PDOMWriter implements IPDOMASTProcessor { } } } + } catch (OperationCanceledException e) { } catch (RuntimeException | StackOverflowError | AssertionError e) { th= e; } finally { @@ -494,7 +495,7 @@ public abstract class PDOMWriter implements IPDOMASTProcessor { if (cancelationCheckThrottler <= 0) { if (fCancelState.isCanceled()) throw new OperationCanceledException(); - cancelationCheckThrottler = 1000; + cancelationCheckThrottler = 100; } else { cancelationCheckThrottler--; }