From 1f4c202600a16468bc5346d4a61aad6246c6b3a4 Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 2 Nov 2016 11:21:19 +0100 Subject: [PATCH] don't delay each small write action in the single Save by async filters (IDEA-163365) --- .../com/intellij/execution/impl/AsyncFilterRunner.java | 3 +-- .../openapi/progress/util/ProgressIndicatorUtils.java | 10 ++++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/execution/impl/AsyncFilterRunner.java b/platform/platform-impl/src/com/intellij/execution/impl/AsyncFilterRunner.java index 14af50403a23..183dc14630f2 100644 --- a/platform/platform-impl/src/com/intellij/execution/impl/AsyncFilterRunner.java +++ b/platform/platform-impl/src/com/intellij/execution/impl/AsyncFilterRunner.java @@ -26,7 +26,6 @@ import com.intellij.openapi.progress.util.ProgressIndicatorUtils; import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.NullableComputable; import com.intellij.openapi.util.Ref; -import com.intellij.util.TimeoutUtil; import com.intellij.util.concurrency.AppExecutorUtil; import com.intellij.util.containers.ContainerUtil; import one.util.streamex.IntStreamEx; @@ -89,7 +88,7 @@ class AsyncFilterRunner { applyResults.set(bgComputation.compute()); }; while (!ProgressIndicatorUtils.runInReadActionWithWriteActionPriority(computeInReadAction)) { - TimeoutUtil.sleep(10); + ProgressIndicatorUtils.yieldToPendingWriteActions(); } return applyResults.get(); } diff --git a/platform/platform-impl/src/com/intellij/openapi/progress/util/ProgressIndicatorUtils.java b/platform/platform-impl/src/com/intellij/openapi/progress/util/ProgressIndicatorUtils.java index 3033443617ee..837623d0277e 100644 --- a/platform/platform-impl/src/com/intellij/openapi/progress/util/ProgressIndicatorUtils.java +++ b/platform/platform-impl/src/com/intellij/openapi/progress/util/ProgressIndicatorUtils.java @@ -19,11 +19,13 @@ import com.intellij.openapi.Disposable; import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationAdapter; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.application.ex.ApplicationEx; import com.intellij.openapi.application.ex.ApplicationManagerEx; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; +import com.intellij.openapi.util.EmptyRunnable; import com.intellij.openapi.util.Ref; import com.intellij.util.ui.EdtInvocationManager; import org.jetbrains.annotations.NotNull; @@ -225,4 +227,12 @@ public class ProgressIndicatorUtils { } }, progressIndicator); } + + /** + * Ensure the current EDT activity finishes in case it requires many write actions, with each being delayed a bit + * by background thread read action (until its first checkCanceled call). + */ + public static void yieldToPendingWriteActions() { + ApplicationManager.getApplication().invokeAndWait(EmptyRunnable.INSTANCE, ModalityState.any()); + } }