From 15c60ee68b89fc0848c6d2fddded8755fbcd492e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=A4der?= Date: Tue, 5 Sep 2017 13:41:38 +0200 Subject: [PATCH] Fix wait condition on parallel initialize calls for LS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Thomas Mäder --- .../registry/LanguageServerRegistryImpl.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/wsagent/che-core-api-languageserver/src/main/java/org/eclipse/che/api/languageserver/registry/LanguageServerRegistryImpl.java b/wsagent/che-core-api-languageserver/src/main/java/org/eclipse/che/api/languageserver/registry/LanguageServerRegistryImpl.java index 7a741749417..0fe532293ce 100644 --- a/wsagent/che-core-api-languageserver/src/main/java/org/eclipse/che/api/languageserver/registry/LanguageServerRegistryImpl.java +++ b/wsagent/che-core-api-languageserver/src/main/java/org/eclipse/che/api/languageserver/registry/LanguageServerRegistryImpl.java @@ -109,10 +109,10 @@ public ServerCapabilities initialize(String fileUri) throws LanguageServerExcept if (projectPath == null) { return null; } - List launchers = findLaunchers(projectPath, fileUri); + List requiredToLaunch = findLaunchers(projectPath, fileUri); // launchers is the set of things we need to have initialized - for (LanguageServerLauncher launcher : new ArrayList<>(launchers)) { + for (LanguageServerLauncher launcher : new ArrayList<>(requiredToLaunch)) { synchronized (initializedServers) { List servers = launchedServers.computeIfAbsent(projectPath, k -> new ArrayList<>()); @@ -129,7 +129,7 @@ public ServerCapabilities initialize(String fileUri) throws LanguageServerExcept initializedServers.computeIfAbsent(projectPath, k -> new ArrayList<>()); initialized.add( new InitializedLanguageServer(id, pair.first, pair.second, launcher)); - launchers.remove(launcher); + requiredToLaunch.remove(launcher); initializedServers.notifyAll(); } }) @@ -144,7 +144,7 @@ public ServerCapabilities initialize(String fileUri) throws LanguageServerExcept + t.getMessage())); LOG.error("Error launching language server " + launcher, t); synchronized (initializedServers) { - launchers.remove(launcher); + requiredToLaunch.remove(launcher); servers.remove(launcher); initializedServers.notifyAll(); } @@ -162,12 +162,18 @@ public ServerCapabilities initialize(String fileUri) throws LanguageServerExcept List initForProject = initializedServers.get(projectPath); if (initForProject != null) { for (InitializedLanguageServer initialized : initForProject) { - launchers.remove(initialized.getLauncher()); + requiredToLaunch.remove(initialized.getLauncher()); } } - while (!launchers.isEmpty()) { + while (!requiredToLaunch.isEmpty()) { try { initializedServers.wait(); + initForProject = initializedServers.get(projectPath); + if (initForProject != null) { + for (InitializedLanguageServer initialized : initForProject) { + requiredToLaunch.remove(initialized.getLauncher()); + } + } } catch (InterruptedException e) { Thread.currentThread().interrupt(); return null;