Several improvements around destroying subprocesses
See test/babashka/scripts/child.bb
This commit is contained in:
parent
864cf410ed
commit
65eecdfc1c
3 changed files with 41 additions and 3 deletions
|
|
@ -117,6 +117,7 @@
|
||||||
java.lang.Math
|
java.lang.Math
|
||||||
java.lang.Object
|
java.lang.Object
|
||||||
java.lang.Process
|
java.lang.Process
|
||||||
|
java.lang.ProcessHandle
|
||||||
java.lang.ProcessBuilder
|
java.lang.ProcessBuilder
|
||||||
java.lang.ProcessBuilder$Redirect
|
java.lang.ProcessBuilder$Redirect
|
||||||
java.lang.Runtime
|
java.lang.Runtime
|
||||||
|
|
@ -198,6 +199,7 @@
|
||||||
java.util.jar.JarFile
|
java.util.jar.JarFile
|
||||||
java.util.jar.JarEntry
|
java.util.jar.JarEntry
|
||||||
java.util.jar.JarFile$JarFileEntry
|
java.util.jar.JarFile$JarFileEntry
|
||||||
|
java.util.stream.Stream
|
||||||
java.util.Random
|
java.util.Random
|
||||||
java.util.regex.Pattern
|
java.util.regex.Pattern
|
||||||
java.util.Base64
|
java.util.Base64
|
||||||
|
|
@ -242,7 +244,8 @@
|
||||||
clojure.lang.Named
|
clojure.lang.Named
|
||||||
clojure.lang.Keyword
|
clojure.lang.Keyword
|
||||||
clojure.lang.Symbol
|
clojure.lang.Symbol
|
||||||
clojure.lang.Sequential]
|
clojure.lang.Sequential
|
||||||
|
java.util.List]
|
||||||
:custom ~custom-map})
|
:custom ~custom-map})
|
||||||
|
|
||||||
(defmacro gen-class-map []
|
(defmacro gen-class-map []
|
||||||
|
|
@ -260,6 +263,8 @@
|
||||||
(fn [v]
|
(fn [v]
|
||||||
(cond (instance? java.lang.Process v)
|
(cond (instance? java.lang.Process v)
|
||||||
java.lang.Process
|
java.lang.Process
|
||||||
|
(instance? java.lang.ProcessHandle v)
|
||||||
|
java.lang.ProcessHandle
|
||||||
;; added for calling .put on .environment from ProcessBuilder
|
;; added for calling .put on .environment from ProcessBuilder
|
||||||
(instance? java.util.Map v)
|
(instance? java.util.Map v)
|
||||||
java.util.Map
|
java.util.Map
|
||||||
|
|
@ -279,7 +284,9 @@
|
||||||
(instance? java.nio.file.FileSystem v)
|
(instance? java.nio.file.FileSystem v)
|
||||||
java.nio.file.FileSystem
|
java.nio.file.FileSystem
|
||||||
(instance? java.nio.file.PathMatcher v)
|
(instance? java.nio.file.PathMatcher v)
|
||||||
java.nio.file.PathMatcher)))))
|
java.nio.file.PathMatcher
|
||||||
|
(instance? java.util.stream.Stream v)
|
||||||
|
java.util.stream.Stream)))))
|
||||||
|
|
||||||
(def class-map (gen-class-map))
|
(def class-map (gen-class-map))
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -240,7 +240,12 @@
|
||||||
(def output (.getInputStream ls))
|
(def output (.getInputStream ls))
|
||||||
(assert (int? (.waitFor ls)))
|
(assert (int? (.waitFor ls)))
|
||||||
(slurp output)")
|
(slurp output)")
|
||||||
"LICENSE")))
|
"LICENSE"))
|
||||||
|
(when test-utils/native?
|
||||||
|
(let [output (test-utils/bb nil (io/file "test" "babashka" "scripts" "child.bb"))
|
||||||
|
parsed (edn/read-string (format "[%s]" output))]
|
||||||
|
(is (every? number? parsed))
|
||||||
|
(is (= 3 (count parsed))))))
|
||||||
|
|
||||||
(deftest create-temp-file-test
|
(deftest create-temp-file-test
|
||||||
(let [temp-dir-path (System/getProperty "java.io.tmpdir")]
|
(let [temp-dir-path (System/getProperty "java.io.tmpdir")]
|
||||||
|
|
|
||||||
26
test/babashka/scripts/child.bb
Normal file
26
test/babashka/scripts/child.bb
Normal file
|
|
@ -0,0 +1,26 @@
|
||||||
|
(import 'java.util.List)
|
||||||
|
|
||||||
|
(set! *warn-on-reflection* true)
|
||||||
|
|
||||||
|
(defn handles [^java.lang.ProcessHandle x]
|
||||||
|
(distinct (cons x (mapcat handles (iterator-seq (.iterator (.descendants x)))))))
|
||||||
|
|
||||||
|
(defn run [& args]
|
||||||
|
(let [depth (or (System/getenv "DEPTH") "0")
|
||||||
|
depth (Integer/parseInt depth)]
|
||||||
|
(when-not (= 4 depth)
|
||||||
|
(let [pb (doto (ProcessBuilder. ^List args)
|
||||||
|
(.inheritIO))
|
||||||
|
_ (.put (.environment pb) "DEPTH"
|
||||||
|
(str (inc depth)))
|
||||||
|
proc (.start pb)]
|
||||||
|
(if (= 0 depth) ;; the top process
|
||||||
|
(do
|
||||||
|
(Thread/sleep 500)
|
||||||
|
(run! (fn [^java.lang.ProcessHandle handle]
|
||||||
|
(do (prn (.pid handle))
|
||||||
|
(.destroy handle)))
|
||||||
|
(handles (.toHandle proc))))
|
||||||
|
(Thread/sleep 100000000))))))
|
||||||
|
|
||||||
|
(run "./bb" *file*)
|
||||||
Loading…
Reference in a new issue