From c6ffd228bd5b2704132359fd3e53ffa7838efdbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Raddum=20Berg?= Date: Sat, 17 Feb 2024 23:17:23 +0100 Subject: [PATCH 1/3] use `ProcessHandle`instead of svm --- build.sc | 3 -- .../src/libdaemonjvm/internal/IsRunning.java | 7 ---- .../libdaemonjvm/internal/IsRunningSubst.java | 18 ----------- .../libdaemonjvm/internal/LockProcess.scala | 8 ++--- library/src/libdaemonjvm/internal/Pid.java | 16 ---------- .../src/libdaemonjvm/internal/PidSubst.java | 18 ----------- .../src/libdaemonjvm/internal/Processes.scala | 32 ------------------- 7 files changed, 2 insertions(+), 100 deletions(-) delete mode 100644 library/src/libdaemonjvm/internal/IsRunning.java delete mode 100644 library/src/libdaemonjvm/internal/IsRunningSubst.java delete mode 100644 library/src/libdaemonjvm/internal/Pid.java delete mode 100644 library/src/libdaemonjvm/internal/PidSubst.java delete mode 100644 library/src/libdaemonjvm/internal/Processes.scala diff --git a/build.sc b/build.sc index b6f4228..819f6bb 100644 --- a/build.sc +++ b/build.sc @@ -26,9 +26,6 @@ def tmpDirBase = class Library(val crossScalaVersion: String) extends CrossScalaModule with LibDaemonPublish { def artifactName = "libdaemon" - def compileIvyDeps = super.compileIvyDeps() ++ Seq( - ivy"org.graalvm.nativeimage:svm:21.2.0" - ) def javacOptions = super.javacOptions() ++ Seq( "--release", "16" diff --git a/library/src/libdaemonjvm/internal/IsRunning.java b/library/src/libdaemonjvm/internal/IsRunning.java deleted file mode 100644 index eb154bf..0000000 --- a/library/src/libdaemonjvm/internal/IsRunning.java +++ /dev/null @@ -1,7 +0,0 @@ -package libdaemonjvm.internal; - -public class IsRunning { - public Boolean isRunning(int pid) { - return null; - } -} diff --git a/library/src/libdaemonjvm/internal/IsRunningSubst.java b/library/src/libdaemonjvm/internal/IsRunningSubst.java deleted file mode 100644 index d1b41a6..0000000 --- a/library/src/libdaemonjvm/internal/IsRunningSubst.java +++ /dev/null @@ -1,18 +0,0 @@ -package libdaemonjvm.internal; - -import com.oracle.svm.core.annotate.Substitute; -import com.oracle.svm.core.annotate.TargetClass; -import com.oracle.svm.core.posix.headers.Signal; -import org.graalvm.nativeimage.Platform; -import org.graalvm.nativeimage.Platforms; - -import java.nio.file.Path; - -@TargetClass(className = "libdaemonjvm.internal.IsRunning") -@Platforms({Platform.LINUX.class, Platform.DARWIN.class}) -final class IsRunningSubst { - @Substitute - Boolean isRunning(int pid) { - return Signal.kill(pid, 0) == 0; - } -} diff --git a/library/src/libdaemonjvm/internal/LockProcess.scala b/library/src/libdaemonjvm/internal/LockProcess.scala index 6e09a74..bda3d7a 100644 --- a/library/src/libdaemonjvm/internal/LockProcess.scala +++ b/library/src/libdaemonjvm/internal/LockProcess.scala @@ -8,13 +8,9 @@ trait LockProcess { object LockProcess { class Default extends LockProcess { def pid(): Int = - Option((new Pid).get()).map(n => (n: Int)).getOrElse { - sys.error("Cannot get PID") - } + ProcessHandle.current().pid().toInt def isRunning(pid: Int): Boolean = - Option((new IsRunning).isRunning(pid)).map(b => (b: Boolean)).getOrElse { - Processes.isRunning(pid) - } + ProcessHandle.of(pid).map(p => p.isAlive).orElse(false) } def default: LockProcess = diff --git a/library/src/libdaemonjvm/internal/Pid.java b/library/src/libdaemonjvm/internal/Pid.java deleted file mode 100644 index 39cc7c8..0000000 --- a/library/src/libdaemonjvm/internal/Pid.java +++ /dev/null @@ -1,16 +0,0 @@ -package libdaemonjvm.internal; - -import java.lang.management.ManagementFactory; - -public class Pid { - public Integer get() { - try { - String name = ManagementFactory.getRuntimeMXBean().getName(); - int idx = name.indexOf('@'); - String pidStr = name.substring(0, idx); - return Integer.parseInt(pidStr); - } catch (NumberFormatException ex) { - return null; - } - } -} diff --git a/library/src/libdaemonjvm/internal/PidSubst.java b/library/src/libdaemonjvm/internal/PidSubst.java deleted file mode 100644 index 8f7240a..0000000 --- a/library/src/libdaemonjvm/internal/PidSubst.java +++ /dev/null @@ -1,18 +0,0 @@ -package libdaemonjvm.internal; - -import com.oracle.svm.core.annotate.Substitute; -import com.oracle.svm.core.annotate.TargetClass; -import com.oracle.svm.core.posix.headers.Unistd; -import org.graalvm.nativeimage.Platform; -import org.graalvm.nativeimage.Platforms; - -import java.nio.file.Path; - -@TargetClass(className = "libdaemonjvm.internal.Pid") -@Platforms({Platform.LINUX.class, Platform.DARWIN.class}) -final class PidSubst { - @Substitute - Integer get() { - return Unistd.getpid(); - } -} diff --git a/library/src/libdaemonjvm/internal/Processes.scala b/library/src/libdaemonjvm/internal/Processes.scala deleted file mode 100644 index 73e995c..0000000 --- a/library/src/libdaemonjvm/internal/Processes.scala +++ /dev/null @@ -1,32 +0,0 @@ -package libdaemonjvm.internal - -import scala.util.Properties -import scala.sys.process._ - -object Processes { - def isRunning(pid: Int): Boolean = { - val pids = - if (Properties.isWin) { - val output = Seq(System.getenv("WINDIR") + "\\system32\\tasklist.exe", "/fo", "list").!! - output - .linesIterator - .map(_.trim) - .filter(_.startsWith("PID:")) - .map(_.stripPrefix("PID:").trim) - .map(_.toInt) - .toSet - } - else { - val output = Seq("ps", "-e").!! - output - .linesIterator - .map(_.dropWhile(_.isSpaceChar)) - .filter(_.nonEmpty) - .filter(_.head.isDigit) - .map(_.takeWhile(_.isDigit)) - .map(_.toInt) - .toSet - } - pids.contains(pid) - } -} From 4d02fe6a9908ff3b04759dd8e12d1cc348fd54b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Raddum=20Berg?= Date: Sun, 18 Feb 2024 08:55:54 +0100 Subject: [PATCH 2/3] meh 2.12 --- library/src/libdaemonjvm/internal/LockProcess.scala | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/library/src/libdaemonjvm/internal/LockProcess.scala b/library/src/libdaemonjvm/internal/LockProcess.scala index bda3d7a..9a4a0cd 100644 --- a/library/src/libdaemonjvm/internal/LockProcess.scala +++ b/library/src/libdaemonjvm/internal/LockProcess.scala @@ -9,8 +9,11 @@ object LockProcess { class Default extends LockProcess { def pid(): Int = ProcessHandle.current().pid().toInt - def isRunning(pid: Int): Boolean = - ProcessHandle.of(pid).map(p => p.isAlive).orElse(false) + def isRunning(pid: Int): Boolean = { + val maybeHandle = ProcessHandle.of(pid) + if (maybeHandle.isEmpty) false + else maybeHandle.get.isAlive + } } def default: LockProcess = From ffff810cca51d2457c68168879df6aa8313558a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Raddum=20Berg?= Date: Sun, 18 Feb 2024 15:08:27 +0100 Subject: [PATCH 3/3] meh scalafmt --- library/src/libdaemonjvm/internal/LockProcess.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/src/libdaemonjvm/internal/LockProcess.scala b/library/src/libdaemonjvm/internal/LockProcess.scala index 9a4a0cd..0dc6d70 100644 --- a/library/src/libdaemonjvm/internal/LockProcess.scala +++ b/library/src/libdaemonjvm/internal/LockProcess.scala @@ -12,7 +12,7 @@ object LockProcess { def isRunning(pid: Int): Boolean = { val maybeHandle = ProcessHandle.of(pid) if (maybeHandle.isEmpty) false - else maybeHandle.get.isAlive + else maybeHandle.get.isAlive } }