3535import java .net .InetAddress ;
3636import java .net .Socket ;
3737import java .net .URI ;
38+ import java .util .Collection ;
3839import java .util .HashSet ;
3940import java .util .List ;
4041import java .util .Map ;
4142import java .util .Optional ;
4243import java .util .concurrent .CancellationException ;
4344import java .util .concurrent .CompletableFuture ;
4445import java .util .concurrent .ConcurrentHashMap ;
46+ import java .util .concurrent .CopyOnWriteArrayList ;
4547import java .util .concurrent .ExecutionException ;
4648import java .util .concurrent .ExecutorService ;
4749import java .util .concurrent .Future ;
@@ -87,6 +89,7 @@ public class LanguageServerRouter extends BaseLanguageServer.ActualLanguageServe
8789
8890 private final Map <String , String > languagesByExtension ;
8991 private final Map <String , CompletableFuture <IBaseLanguageServerExtensions >> languageServers ;
92+ private final Collection <Process > delegateProcesses = new CopyOnWriteArrayList <>();
9093
9194 private @ MonotonicNonNull InitializeParams initializeParams ;
9295
@@ -98,6 +101,9 @@ public LanguageServerRouter(Runnable onExit, ExecutorService exec) {
98101
99102 this .languagesByExtension = new ConcurrentHashMap <>();
100103 this .languageServers = new ConcurrentHashMap <>();
104+
105+ // Shutdown child processes when we exit
106+ Runtime .getRuntime ().addShutdownHook (new Thread (() -> delegateProcesses .forEach (Process ::destroy )));
101107 }
102108
103109 /*package*/ public CompletableFuture <IBaseLanguageServerExtensions > languageByName (String lang ) {
0 commit comments