From 0579947d2a111cc528fcbbbcfda69e05f8e2daf4 Mon Sep 17 00:00:00 2001 From: Vyacheslav Karpukhin Date: Mon, 23 Jul 2018 15:29:10 +0200 Subject: [PATCH] IDEA-190226 Get rid of using current approach for OSProcessUtil#getCurrentProcessId() --- .../execution/process/OSProcessUtil.java | 16 +++++++++------- .../src/com/intellij/util/Restarter.java | 3 ++- .../execution/process/WinProcessManager.java | 19 +++++++++++++++++-- 3 files changed, 28 insertions(+), 10 deletions(-) rename platform/{platform-impl => util}/src/com/intellij/execution/process/WinProcessManager.java (85%) diff --git a/platform/platform-impl/src/com/intellij/execution/process/OSProcessUtil.java b/platform/platform-impl/src/com/intellij/execution/process/OSProcessUtil.java index 87bbb85d08c3..d707fb39b4e9 100644 --- a/platform/platform-impl/src/com/intellij/execution/process/OSProcessUtil.java +++ b/platform/platform-impl/src/com/intellij/execution/process/OSProcessUtil.java @@ -10,7 +10,6 @@ import com.pty4j.windows.WinPtyProcess; import org.jetbrains.annotations.NotNull; import org.jvnet.winp.WinProcess; -import java.lang.management.ManagementFactory; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -112,13 +111,16 @@ public class OSProcessUtil { } private static String getCurrentProcessId() { - try { - String name = ManagementFactory.getRuntimeMXBean().getName(); - return name.split("@")[0]; + int pid; + + if (SystemInfo.isWindows) { + pid = WinProcessManager.getCurrentProcessId(); } - catch (Exception e) { - return "-1"; + else { + pid = UnixProcessManager.getCurrentProcessId(); } + + return String.valueOf(pid); } public static String getApplicationPid() { @@ -126,7 +128,7 @@ public class OSProcessUtil { ourPid = getCurrentProcessId(); } - return String.valueOf(ourPid); + return ourPid; } /** @deprecated trivial; use {@link #getProcessList()} directly (to be removed in IDEA 2019) */ diff --git a/platform/platform-impl/src/com/intellij/util/Restarter.java b/platform/platform-impl/src/com/intellij/util/Restarter.java index 4069e2bb7f63..37ba227bd108 100644 --- a/platform/platform-impl/src/com/intellij/util/Restarter.java +++ b/platform/platform-impl/src/com/intellij/util/Restarter.java @@ -3,6 +3,7 @@ package com.intellij.util; import com.intellij.execution.configurations.PathEnvironmentVariableUtil; import com.intellij.execution.process.UnixProcessManager; +import com.intellij.execution.process.WinProcessManager; import com.intellij.ide.actions.CreateDesktopEntryAction; import com.intellij.jna.JnaLoader; import com.intellij.openapi.application.PathManager; @@ -113,7 +114,7 @@ public class Restarter { Kernel32 kernel32 = Native.loadLibrary("kernel32", Kernel32.class); Shell32 shell32 = Native.loadLibrary("shell32", Shell32.class); - int pid = kernel32.GetCurrentProcessId(); + int pid = WinProcessManager.getCurrentProcessId(); IntByReference argc = new IntByReference(); Pointer argvPtr = shell32.CommandLineToArgvW(kernel32.GetCommandLineW(), argc); String[] argv = getRestartArgv(argvPtr.getWideStringArray(0, argc.getValue())); diff --git a/platform/platform-impl/src/com/intellij/execution/process/WinProcessManager.java b/platform/util/src/com/intellij/execution/process/WinProcessManager.java similarity index 85% rename from platform/platform-impl/src/com/intellij/execution/process/WinProcessManager.java rename to platform/util/src/com/intellij/execution/process/WinProcessManager.java index 81a9be0ff1dc..c3d9c96486ef 100644 --- a/platform/platform-impl/src/com/intellij/execution/process/WinProcessManager.java +++ b/platform/util/src/com/intellij/execution/process/WinProcessManager.java @@ -6,6 +6,7 @@ import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.ReflectionUtil; +import com.sun.jna.Native; import com.sun.jna.Pointer; import com.sun.jna.platform.win32.Kernel32; import com.sun.jna.platform.win32.WinNT; @@ -17,7 +18,7 @@ import static com.intellij.util.ObjectUtils.assertNotNull; * * @author Alexey.Ushakov */ -class WinProcessManager { +public class WinProcessManager { private static final Logger LOG = Logger.getInstance(WinProcessManager.class); private WinProcessManager() { } @@ -42,6 +43,11 @@ class WinProcessManager { throw new IllegalStateException("Unable to get PID from instance of " + process.getClass() + ", OS: " + SystemInfo.OS_NAME); } + public static int getCurrentProcessId() { + Kernel32 kernel32 = Native.loadLibrary("kernel32", Kernel32.class); + return kernel32.GetCurrentProcessId(); + } + public static boolean kill(Process process, boolean tree) { return kill(-1, process, tree); } @@ -64,7 +70,7 @@ class WinProcessManager { String output = FileUtil.loadTextAndClose(p.getInputStream()); int res = p.waitFor(); - if (res != 0 && (process == null || process.isAlive())) { + if (res != 0 && (process == null || isAlive(process))) { LOG.warn(StringUtil.join(cmdArray, " ") + " failed: " + output); return false; } @@ -79,4 +85,13 @@ class WinProcessManager { } return false; } + + private static boolean isAlive(Process process) { + try { + process.exitValue(); + return false; + } catch(IllegalThreadStateException e) { + return true; + } + } } \ No newline at end of file