[util] use method handles to access internal Signal class in UnixProcessManager
authorNikolay Chashnikov <Nikolay.Chashnikov@jetbrains.com>
Wed, 12 Aug 2020 17:24:11 +0000 (20:24 +0300)
committerintellij-monorepo-bot <intellij-monorepo-bot-no-reply@jetbrains.com>
Wed, 12 Aug 2020 18:36:01 +0000 (18:36 +0000)
This is needed to be able to compile intellij.platform.util module using JDK 11 (IDEA-248086).

GitOrigin-RevId: 09cefe379b564f34a637c7687cc4bde77539ecca

platform/util/src/com/intellij/execution/process/UnixProcessManager.java

index c982d50358ebe9931d20c7fc2600a3c60911ee42..aea8a46bd132eff549c34f9657ca007399708c4c 100644 (file)
@@ -11,12 +11,14 @@ import com.intellij.util.ReflectionUtil;
 import com.sun.jna.Library;
 import com.sun.jna.Native;
 import org.jetbrains.annotations.NotNull;
-import sun.misc.Signal;
 
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStreamReader;
+import java.lang.invoke.MethodHandle;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.MethodType;
 import java.nio.charset.StandardCharsets;
 import java.util.*;
 
@@ -26,6 +28,19 @@ import java.util.*;
 public final class UnixProcessManager {
   private static final Logger LOG = Logger.getInstance(UnixProcessManager.class);
 
+  private static final MethodHandle signalStringToIntConverter;
+  static {
+    try {
+      Class<?> signalClass = Class.forName("sun.misc.Signal");
+      MethodHandle signalConstructor = MethodHandles.publicLookup().findConstructor(signalClass, MethodType.methodType(void.class, String.class));
+      MethodHandle getNumber = MethodHandles.publicLookup().findVirtual(signalClass, "getNumber", MethodType.methodType(int.class));
+      signalStringToIntConverter = MethodHandles.filterReturnValue(signalConstructor, getNumber);
+    }
+    catch (Exception e) {
+      throw new RuntimeException(e);
+    }
+  }
+
   // https://en.wikipedia.org/wiki/Signal_(IPC)#POSIX_signals
   public static final int SIGINT = 2;
   public static final int SIGABRT = 6;
@@ -58,14 +73,15 @@ public final class UnixProcessManager {
    * @return -1 for unknown signal
    */
   public static int getSignalNumber(@NotNull String signalName) {
-    final Signal signal;
     try {
-      signal = new Signal(signalName);
+      return (int)signalStringToIntConverter.invokeExact(signalName);
     }
     catch (IllegalArgumentException e) {
       return -1;
     }
-    return signal.getNumber();
+    catch (Throwable t) {
+      throw new RuntimeException(t);
+    }
   }
 
   public static int sendSignal(int pid, @NotNull String signalName) {