diff --git a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/commons/ParentProcessWatcher.java b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/commons/ParentProcessWatcher.java index d19dc13f7..2436234bb 100644 --- a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/commons/ParentProcessWatcher.java +++ b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/commons/ParentProcessWatcher.java @@ -12,19 +12,14 @@ *******************************************************************************/ package org.eclipse.lemminx.commons; -import static org.eclipse.lemminx.utils.platform.Platform.isWindows; - -import java.io.IOException; +import java.util.Optional; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import java.util.function.Function; -import java.util.logging.Level; import java.util.logging.Logger; -import com.google.common.io.Closeables; - import org.eclipse.lsp4j.jsonrpc.MessageConsumer; import org.eclipse.lsp4j.services.LanguageServer; @@ -36,7 +31,6 @@ public final class ParentProcessWatcher implements Runnable, Function { private static final Logger LOGGER = Logger.getLogger(ParentProcessWatcher.class.getName()); - private static final boolean isJava1x = System.getProperty("java.version").startsWith("1."); /** * Exit code returned when XML Language Server is forced to exit. @@ -84,55 +78,8 @@ private boolean parentProcessStillRunning() { if (pid == 0 || lastActivityTime > (System.currentTimeMillis() - INACTIVITY_DELAY_SECS)) { return true; } - String command; - if (isWindows) { - command = "cmd /c \"tasklist /FI \"PID eq " + pid + "\" | findstr " + pid + "\""; - } else { - command = "kill -0 " + pid; - } - Process process = null; - boolean finished = false; - try { - process = Runtime.getRuntime().exec(command); - finished = process.waitFor(POLL_DELAY_SECS, TimeUnit.SECONDS); - if (!finished) { - process.destroy(); - finished = process.waitFor(POLL_DELAY_SECS, TimeUnit.SECONDS); // wait for the process to stop - } - if (isWindows && finished && process.exitValue() > 1) { - // the tasklist command should return 0 (parent process exists) or 1 (parent process doesn't exist) - LOGGER.warning("The tasklist command: '" + command + "' returns " + process.exitValue()); - return true; - } - return !finished || process.exitValue() == 0; - } catch (IOException | InterruptedException e) { - LOGGER.log(Level.WARNING, e.getMessage(), e); - return true; - } finally { - if (process != null) { - if (!finished) { - process.destroyForcibly(); - } - // Terminating or destroying the Process doesn't close the process handle on Windows. - // It is only closed when the Process object is garbage collected (in its finalize() method). - // On Windows, when the Java LS is idle, we need to explicitly request a GC, - // to prevent an accumulation of zombie processes, as finalize() will be called. - if (isWindows) { - // Java >= 9 doesn't close the handle when the process is garbage collected - // We need to close the opened streams - if (!isJava1x) { - Closeables.closeQuietly(process.getInputStream()); - Closeables.closeQuietly(process.getErrorStream()); - try { - Closeables.close(process.getOutputStream(), false); - } catch (IOException e) { - } - } - System.gc(); - } - } - } - + Optional optionalHandle = ProcessHandle.of(pid); + return !optionalHandle.isEmpty() && optionalHandle.get().isAlive(); } @Override