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.*;
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;
* @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) {