From 609fc2d9889694e993adb94338f96335e972f3be Mon Sep 17 00:00:00 2001 From: Martin Lippert Date: Tue, 9 Mar 2021 11:37:48 +0100 Subject: [PATCH] introduced single thread update executor to prevent race conditions among update operations --- .../livehover/v2/SpringProcessLiveHoverUpdater.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessLiveHoverUpdater.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessLiveHoverUpdater.java index 82d0676ea..4bae2af84 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessLiveHoverUpdater.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessLiveHoverUpdater.java @@ -14,6 +14,8 @@ import java.util.Arrays; import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicReference; import org.eclipse.lsp4j.CodeLens; @@ -42,6 +44,10 @@ public class SpringProcessLiveHoverUpdater { private final Map> watchedDocs; private boolean highlightsEnabled = true; + // this update executor puts all the updates to live hovers into a sequence + // to avoid race conditions among different update operations + private final Executor updateExecutor; + public SpringProcessLiveHoverUpdater( SimpleLanguageServer server, BootJavaHoverProvider hoverProvider, @@ -52,6 +58,7 @@ public class SpringProcessLiveHoverUpdater { this.hoverProvider = hoverProvider; this.projectFinder = projectFinder; this.watchedDocs = new ConcurrentHashMap<>(); + this.updateExecutor = Executors.newSingleThreadExecutor(); server.getTextDocumentService().onDidChangeContent(params -> { TextDocument doc = params.getDocument(); @@ -67,7 +74,7 @@ public class SpringProcessLiveHoverUpdater { liveDataProvider.addLiveDataChangeListener(event -> { CompletableFuture.runAsync(() -> { update(); - }); + }, updateExecutor); }); } @@ -84,7 +91,7 @@ public class SpringProcessLiveHoverUpdater { } catch (Throwable t) { log.error("", t); } - }); + }, updateExecutor); } public void unwatchDocument(String docURI) {