diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index 3d46c9c5..b2249438 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -117,6 +117,7 @@ java.lang.Math java.lang.Object java.lang.Process + java.lang.ProcessHandle java.lang.ProcessBuilder java.lang.ProcessBuilder$Redirect java.lang.Runtime @@ -198,6 +199,7 @@ java.util.jar.JarFile java.util.jar.JarEntry java.util.jar.JarFile$JarFileEntry + java.util.stream.Stream java.util.Random java.util.regex.Pattern java.util.Base64 @@ -242,7 +244,8 @@ clojure.lang.Named clojure.lang.Keyword clojure.lang.Symbol - clojure.lang.Sequential] + clojure.lang.Sequential + java.util.List] :custom ~custom-map}) (defmacro gen-class-map [] @@ -260,6 +263,8 @@ (fn [v] (cond (instance? java.lang.Process v) java.lang.Process + (instance? java.lang.ProcessHandle v) + java.lang.ProcessHandle ;; added for calling .put on .environment from ProcessBuilder (instance? java.util.Map v) java.util.Map @@ -279,7 +284,9 @@ (instance? java.nio.file.FileSystem v) java.nio.file.FileSystem (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)) diff --git a/test/babashka/main_test.clj b/test/babashka/main_test.clj index 11a9bdbe..7fb54a32 100644 --- a/test/babashka/main_test.clj +++ b/test/babashka/main_test.clj @@ -240,7 +240,12 @@ (def output (.getInputStream ls)) (assert (int? (.waitFor ls))) (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 (let [temp-dir-path (System/getProperty "java.io.tmpdir")] diff --git a/test/babashka/scripts/child.bb b/test/babashka/scripts/child.bb new file mode 100644 index 00000000..bf30a346 --- /dev/null +++ b/test/babashka/scripts/child.bb @@ -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*)