fix(lsp): Better shutdown sequence
This commit is contained in:
parent
bc408b1d50
commit
cab13c3edd
3 changed files with 19 additions and 9 deletions
|
@ -120,6 +120,7 @@ import java.util.concurrent.Executors;
|
||||||
import java.util.concurrent.Future;
|
import java.util.concurrent.Future;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.concurrent.TimeoutException;
|
import java.util.concurrent.TimeoutException;
|
||||||
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
|
||||||
import static com.falsepattern.zigbrains.lsp.client.languageserver.ServerStatus.INITIALIZED;
|
import static com.falsepattern.zigbrains.lsp.client.languageserver.ServerStatus.INITIALIZED;
|
||||||
import static com.falsepattern.zigbrains.lsp.client.languageserver.ServerStatus.STARTED;
|
import static com.falsepattern.zigbrains.lsp.client.languageserver.ServerStatus.STARTED;
|
||||||
|
@ -150,6 +151,7 @@ public class LanguageServerWrapper {
|
||||||
private volatile boolean alreadyShownTimeout = false;
|
private volatile boolean alreadyShownTimeout = false;
|
||||||
private volatile boolean alreadyShownCrash = false;
|
private volatile boolean alreadyShownCrash = false;
|
||||||
private volatile ServerStatus status = STOPPED;
|
private volatile ServerStatus status = STOPPED;
|
||||||
|
private final AtomicReference<Thread> shutdownHook = new AtomicReference<>();
|
||||||
private static final Map<Pair<String, String>, LanguageServerWrapper> uriToLanguageServerWrapper =
|
private static final Map<Pair<String, String>, LanguageServerWrapper> uriToLanguageServerWrapper =
|
||||||
new ConcurrentHashMap<>();
|
new ConcurrentHashMap<>();
|
||||||
private static final Map<Project, LanguageServerWrapper> projectToLanguageServerWrapper = new ConcurrentHashMap<>();
|
private static final Map<Project, LanguageServerWrapper> projectToLanguageServerWrapper = new ConcurrentHashMap<>();
|
||||||
|
@ -623,6 +625,20 @@ public class LanguageServerWrapper {
|
||||||
private void setStatus(ServerStatus status) {
|
private void setStatus(ServerStatus status) {
|
||||||
this.status = status;
|
this.status = status;
|
||||||
getWidget().ifPresent(widget -> widget.setStatus(status));
|
getWidget().ifPresent(widget -> widget.setStatus(status));
|
||||||
|
synchronized (shutdownHook) {
|
||||||
|
if ((status == STARTED || status == INITIALIZED) && shutdownHook.get() == null) {
|
||||||
|
shutdownHook.set(new Thread(() -> {
|
||||||
|
shutdownHook.set(null);
|
||||||
|
stop(true);
|
||||||
|
}));
|
||||||
|
Runtime.getRuntime().addShutdownHook(shutdownHook.get());
|
||||||
|
} else if (status == STOPPED && shutdownHook.get() != null) {
|
||||||
|
try {
|
||||||
|
Runtime.getRuntime().removeShutdownHook(shutdownHook.get());
|
||||||
|
} catch (IllegalStateException ignored) {} //Shouldn't happen
|
||||||
|
shutdownHook.set(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void crashed(Exception e) {
|
public void crashed(Exception e) {
|
||||||
|
|
|
@ -31,15 +31,9 @@ public class LSPProjectManagerListener implements ProjectManagerListener {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void projectClosing(@NotNull Project project) {
|
public void projectClosing(@NotNull Project project) {
|
||||||
// Removes all the attached LSP status widgets before closing a project. Otherwise the old status widget will
|
Set<LanguageServerWrapper> languageServerWrappers = IntellijLanguageClient.getAllServerWrappersFor(FileUtils.projectToUri(project));
|
||||||
// not be removed when opening a new project in the same project window.
|
|
||||||
Set<LanguageServerWrapper> languageServerWrappers = IntellijLanguageClient.getProjectToLanguageWrappers().get(
|
|
||||||
FileUtils.projectToUri(project));
|
|
||||||
if (languageServerWrappers == null) {
|
|
||||||
// nothing to do
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
languageServerWrappers.forEach(wrapper -> {
|
languageServerWrappers.forEach(wrapper -> {
|
||||||
|
wrapper.stop(false);
|
||||||
wrapper.removeWidget();
|
wrapper.removeWidget();
|
||||||
IntellijLanguageClient.removeWrapper(wrapper);
|
IntellijLanguageClient.removeWrapper(wrapper);
|
||||||
});
|
});
|
||||||
|
|
|
@ -47,7 +47,7 @@ public class ZLSStartupActivity implements ProjectActivity {
|
||||||
for (var wrapper : wrappers) {
|
for (var wrapper : wrappers) {
|
||||||
if (wrapper.serverDefinition.ext.equals("zig")) {
|
if (wrapper.serverDefinition.ext.equals("zig")) {
|
||||||
wrapper.stop(false);
|
wrapper.stop(false);
|
||||||
wrapper.stop(true);
|
wrapper.removeWidget();
|
||||||
IntellijLanguageClient.removeWrapper(wrapper);
|
IntellijLanguageClient.removeWrapper(wrapper);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue