From 94151f89085deaf4fb99cc9fedc2b2db801a5f9a Mon Sep 17 00:00:00 2001 From: Kris De Volder Date: Thu, 22 Mar 2018 11:45:39 -0700 Subject: [PATCH] Fix race condition in test. Make onInitialized mechanism in SimpleLanguageServer more 'robust' w.r.t. to subtle timing issues. The intention of onInitalize is typically to guarantee some initialization code. Therefore it should also be called even if the 'initialized' even is already past. --- .../util/SimpleLanguageServer.java | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleLanguageServer.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleLanguageServer.java index 85aa7186b..9175ea22a 100644 --- a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleLanguageServer.java +++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleLanguageServer.java @@ -83,6 +83,7 @@ import reactor.core.Disposable; import reactor.core.publisher.Mono; import reactor.core.scheduler.Scheduler; import reactor.core.scheduler.Schedulers; +import static org.springframework.ide.vscode.commons.languageserver.util.AsyncRunner.*; /** * Abstract base class to implement LanguageServer. Bits and pieces copied from @@ -131,8 +132,7 @@ public class SimpleLanguageServer implements Sts4LanguageServer, LanguageClientA private boolean hasFileWatcherRegistrationSupport; private Consumer initializeHandler; - - private Runnable initializedHandler; + private CompletableFuture initialized = new CompletableFuture(); private Runnable shutdownHandler; @@ -262,10 +262,7 @@ public class SimpleLanguageServer implements Sts4LanguageServer, LanguageClientA Registration registration = new Registration(WORKSPACE_FOLDERS_CAPABILITY_ID, WORKSPACE_FOLDERS_CAPABILITY_NAME, null); RegistrationParams registrationParams = new RegistrationParams(Collections.singletonList(registration)); getClient().registerCapability(registrationParams); - Runnable h = this.initializedHandler; - if (h!=null) { - h.run(); - } + this.initialized.complete(null); // triggers onInitialized handlers. }); } @@ -644,15 +641,7 @@ public class SimpleLanguageServer implements Sts4LanguageServer, LanguageClientA } public synchronized void onInitialized(Runnable handler) { - if (this.initializedHandler==null) { - this.initializedHandler = handler; - } else { - Runnable oldHandler = this.initializedHandler; - this.initializedHandler = () -> { - oldHandler.run(); - handler.run(); - }; - } + thenLog(log, this.initialized.thenAccept((whocares) -> handler.run())); } public synchronized void onShutdown(Runnable handler) {