From 7bc7d5579cc89dc32764f77fee58cee10b5c8188 Mon Sep 17 00:00:00 2001 From: Sergey Simonchik Date: Wed, 17 Jun 2015 01:02:43 +0300 Subject: [PATCH] kill process tree on pooled thread (IDEA-141457) --- .../execution/process/OSProcessHandler.java | 40 ++++++++++++++++--- 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/platform/platform-api/src/com/intellij/execution/process/OSProcessHandler.java b/platform/platform-api/src/com/intellij/execution/process/OSProcessHandler.java index bcfa033b21b9..4ce8a9acd743 100644 --- a/platform/platform-api/src/com/intellij/execution/process/OSProcessHandler.java +++ b/platform/platform-api/src/com/intellij/execution/process/OSProcessHandler.java @@ -95,19 +95,47 @@ public class OSProcessHandler extends BaseOSProcessHandler { } /** - * Kill the whole process tree. + * Kills the whole process tree asynchronously. + * As a potentially time-consuming operation, it's executed asynchronously on a pooled thread. * * @param process Process - * @return True if process tree has been successfully killed. */ - protected boolean killProcessTree(@NotNull Process process) { + protected void killProcessTree(@NotNull final Process process) { + if (ApplicationManager.getApplication().isUnitTestMode()) { + killProcessTreeSync(process); + } + else { + executeOnPooledThread(new Runnable() { + @Override + public void run() { + killProcessTreeSync(process); + } + }); + } + } + + private void killProcessTreeSync(@NotNull Process process) { LOG.debug("killing process tree"); final boolean destroyed = OSProcessManager.getInstance().killProcessTree(process); if (!destroyed) { - LOG.warn("Cannot kill process tree. Trying to destroy process using Java API. Cmdline:\n" + myCommandLine); - process.destroy(); + if (isTerminated(process)) { + LOG.warn("Process has been already terminated: " + myCommandLine); + } + else { + LOG.warn("Cannot kill process tree. Trying to destroy process using Java API. Cmdline:\n" + myCommandLine); + process.destroy(); + } + } + } + + private static boolean isTerminated(@NotNull Process process) { + try { + process.exitValue(); + return true; + } + catch (IllegalThreadStateException e) { + return false; } - return destroyed; } /** -- 2.32.0