From c052a0e3027b8dcbd970c4647a38c7199c9e59cd Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 31 Jul 2018 06:09:23 -0700 Subject: [PATCH] a more safe and performant way of fixing IDEA-CR-35432 IDEA-191113 Don't show "Background tasks running" if we know the tasks can be safely resumed --- .../progress/impl/CoreProgressManager.java | 6 ++++++ .../progress/impl/ProgressManagerImpl.java | 16 +++++++++------- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/platform/core-impl/src/com/intellij/openapi/progress/impl/CoreProgressManager.java b/platform/core-impl/src/com/intellij/openapi/progress/impl/CoreProgressManager.java index 3cabf9338e59..8b87d0685964 100644 --- a/platform/core-impl/src/com/intellij/openapi/progress/impl/CoreProgressManager.java +++ b/platform/core-impl/src/com/intellij/openapi/progress/impl/CoreProgressManager.java @@ -105,6 +105,12 @@ public class CoreProgressManager extends ProgressManager implements Disposable { } } + List getCurrentIndicators() { + synchronized (threadsUnderIndicator) { + return new ArrayList<>(threadsUnderIndicator.keySet()); + } + } + public static boolean runCheckCanceledHooks(@Nullable ProgressIndicator indicator) { CheckCanceledHook hook = ourCheckCanceledHook; return hook != null && hook.runHook(indicator); diff --git a/platform/platform-impl/src/com/intellij/openapi/progress/impl/ProgressManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/progress/impl/ProgressManagerImpl.java index ff1e069b54b6..5725d6706ebd 100644 --- a/platform/platform-impl/src/com/intellij/openapi/progress/impl/ProgressManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/progress/impl/ProgressManagerImpl.java @@ -12,6 +12,7 @@ import com.intellij.openapi.progress.Task; import com.intellij.openapi.progress.util.PingProgress; import com.intellij.openapi.progress.util.ProgressIndicatorUtils; import com.intellij.openapi.progress.util.ProgressWindow; +import com.intellij.openapi.util.Key; import com.intellij.openapi.wm.WindowManager; import com.intellij.ui.SystemNotifications; import com.intellij.util.concurrency.AppExecutorUtil; @@ -30,8 +31,8 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.locks.LockSupport; public class ProgressManagerImpl extends CoreProgressManager implements Disposable { + private static final Key SAFE_PROGRESS_INDICATOR = Key.create("SAFE_PROGRESS_INDICATOR"); private final Set myHooks = ContainerUtil.newConcurrentSet(); - private final Set myUnsafeProgresses = ContainerUtil.newConcurrentSet(); public ProgressManagerImpl() { HeavyProcessLatch.INSTANCE.addUIActivityListener(new HeavyProcessLatch.HeavyProcessListener() { @@ -61,21 +62,23 @@ public class ProgressManagerImpl extends CoreProgressManager implements Disposab @Override public boolean hasUnsafeProgressIndicator() { - return super.hasUnsafeProgressIndicator() || !myUnsafeProgresses.isEmpty(); + return super.hasUnsafeProgressIndicator() || ContainerUtil.exists(getCurrentIndicators(), ProgressManagerImpl::isUnsafeIndicator); + } + + private static boolean isUnsafeIndicator(ProgressIndicator indicator) { + return indicator instanceof ProgressWindow && ((ProgressWindow)indicator).getUserData(SAFE_PROGRESS_INDICATOR) == null; } /** * The passes progress won't count in {@link #hasUnsafeProgressIndicator()} and won't stop from application exiting. */ public void markProgressSafe(@NotNull ProgressWindow progress) { - myUnsafeProgresses.remove(progress); + progress.putUserData(SAFE_PROGRESS_INDICATOR, true); } @Override public void executeProcessUnderProgress(@NotNull Runnable process, ProgressIndicator progress) throws ProcessCanceledException { - if (progress instanceof ProgressWindow) myUnsafeProgresses.add((ProgressWindow)progress); - - CheckCanceledHook hook = progress instanceof PingProgress && ApplicationManager.getApplication().isDispatchThread() + CheckCanceledHook hook = progress instanceof PingProgress && ApplicationManager.getApplication().isDispatchThread() ? p -> { ((PingProgress)progress).interact(); return true; } : null; if (hook != null) addCheckCanceledHook(hook); @@ -84,7 +87,6 @@ public class ProgressManagerImpl extends CoreProgressManager implements Disposab super.executeProcessUnderProgress(process, progress); } finally { - if (progress instanceof ProgressWindow) myUnsafeProgresses.remove((ProgressWindow)progress); if (hook != null) removeCheckCanceledHook(hook); } }