From 1436d11728f89a96135d38cbcc7d0e3f8497182c Mon Sep 17 00:00:00 2001 From: Anton Makeev Date: Thu, 27 Oct 2016 14:26:50 +0200 Subject: [PATCH] wait for pending filters in cmake console --- .../execution/impl/AsyncFilterRunner.java | 26 ++++++++++++++----- .../impl/EditorHyperlinkSupport.java | 4 +++ 2 files changed, 23 insertions(+), 7 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 bda01679295f..760b1f87d898 100644 --- a/platform/platform-impl/src/com/intellij/execution/impl/AsyncFilterRunner.java +++ b/platform/platform-impl/src/com/intellij/execution/impl/AsyncFilterRunner.java @@ -32,9 +32,7 @@ import com.intellij.util.containers.ContainerUtil; import one.util.streamex.IntStreamEx; import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import java.util.*; import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; @@ -49,6 +47,7 @@ class AsyncFilterRunner { private static final ExecutorService ourExecutor = AppExecutorUtil.createBoundedApplicationPoolExecutor("console filters", 1); private final EditorHyperlinkSupport myHyperlinks; private final Editor myEditor; + private final Map> myPendingFilterResults = new LinkedHashMap<>(); AsyncFilterRunner(EditorHyperlinkSupport hyperlinks, Editor editor) { myHyperlinks = hyperlinks; @@ -71,11 +70,15 @@ class AsyncFilterRunner { Future future = ourExecutor.submit(() -> { FilterResults results = computeWithWritePriority(bgComputation); if (!results.myResults.isEmpty()) { - ApplicationManager.getApplication().invokeLater(() -> results.applyHighlights(myHyperlinks), ModalityState.any(), o -> handled.get()); + ApplicationManager.getApplication().invokeLater(() -> { + results.applyHighlights(myHyperlinks); + myPendingFilterResults.remove(handled); + }, ModalityState.any(), o -> handled.get()); } return results; }); - handleSynchronouslyIfQuick(handled, future); + myPendingFilterResults.put(handled, future); + handleSynchronouslyIfQuick(handled, future, 5); } @NotNull @@ -91,10 +94,11 @@ class AsyncFilterRunner { return applyResults.get(); } - private void handleSynchronouslyIfQuick(AtomicBoolean handled, Future future) { + private void handleSynchronouslyIfQuick(AtomicBoolean handled, Future future, int timeout) { try { - future.get(5, TimeUnit.MILLISECONDS).applyHighlights(myHyperlinks); + future.get(timeout, TimeUnit.MILLISECONDS).applyHighlights(myHyperlinks); handled.set(true); + myPendingFilterResults.remove(handled); } catch (TimeoutException ignored) { } @@ -102,6 +106,14 @@ class AsyncFilterRunner { throw new RuntimeException(e); } } + + public void waitForPendingFilters() { + ApplicationManager.getApplication().assertIsDispatchThread(); + while(!myPendingFilterResults.isEmpty()) { + Map.Entry> next = myPendingFilterResults.entrySet().iterator().next(); + handleSynchronouslyIfQuick(next.getKey(), next.getValue(), 1000); + } + } @NotNull private Computable highlightHyperlinksAsync(Filter filter, int startLine, int endLine) { diff --git a/platform/platform-impl/src/com/intellij/execution/impl/EditorHyperlinkSupport.java b/platform/platform-impl/src/com/intellij/execution/impl/EditorHyperlinkSupport.java index 47cf10c9a95a..87c56122c612 100644 --- a/platform/platform-impl/src/com/intellij/execution/impl/EditorHyperlinkSupport.java +++ b/platform/platform-impl/src/com/intellij/execution/impl/EditorHyperlinkSupport.java @@ -110,6 +110,10 @@ public class EditorHyperlinkSupport { } } + public void waitForPendingFilters() { + myFilterRunner.waitForPendingFilters(); + } + @Deprecated public Map getHyperlinks() { LinkedHashMap result = new LinkedHashMap<>();