Changeset 15358


Ignore:
Timestamp:
07/30/20 14:09:11 (3 years ago)
Author:
Mark Evenson
Message:

Fix SYS:RUN-PROGRAM issues with openjdk11

On non-Windows platforms, java.lang.UNIXProcess is no longer present
in openjdk11, having been replaced with java.lang.ProcessImpl?. We now
use the platform conditionals now present in CL:*FEATURES* to choose
the present implementation to get the process id.

c.f. <https://mailman.common-lisp.net/pipermail/armedbear-devel/2020-July/004067.html>
ff.

Fixes <https://abcl.org/trac/ticket/470>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/abcl/src/org/armedbear/lisp/run-program.lisp

    r15041 r15358  
    3333(require :java)
    3434
    35 (defparameter *implementations*
    36   '(:java-1.6 :java-1.7 :java-1.8)) ;; UNUSED
    37 (defun not-java-6 ()
    38   (not (find :java-1.6 *features*)))
     35(defun not-java-6-p ()
     36  (not (find :java-6 *features*)))
     37
     38(defun pre-java-11-p ()
     39  (or (find :java-6 *features*)
     40      (find :java-7 *features*)
     41      (find :java-8 *features*)))
    3942
    4043(export '(run-program process process-p process-input process-output
     
    169172        (java:jcall "directory" process-builder (java:jnew "java.io.File" (namestring directory))))
    170173      (let ((process
    171              (if (not-java-6)
     174             (if (not-java-6-p)
    172175                 (make-process (%process-builder-start process-builder)
    173176                               input-stream-p output-stream-p error-stream-p)
     
    189192              (threads:make-thread (lambda () (to-file error file :append appendp))))))
    190193        (when (or wait
    191                   (not-java-6)
     194                  (not-java-6-p)
    192195                  (process-wait process))
    193196          process)))))
     
    223226  (let ((redirect (if (eq value T)
    224227                      ;; Either inherit stdio or fail
    225                       (if (not-java-6)
     228                      (if (not-java-6-p)
    226229                          +inherit+
    227230                          (signal 'implementation-not-available
     
    238241                                  ((NIL)
    239242                                   (return-from setup-input-redirection))))))
    240                         (if (not-java-6)
     243                        (if (not-java-6-p)
    241244                            (java:jstatic "from" "java.lang.ProcessBuilder$Redirect" file)
    242245                            file)))))
    243     (when (not-java-6)
     246    (when (not-java-6-p)
    244247      (java:jcall "redirectInput" process-builder redirect))
    245248    redirect))
     
    251254(defun setup-output-redirection (process-builder value errorp if-does-exist)
    252255  (let ((redirect (if (eq value T)
    253                       (if (not-java-6)
     256                      (if (not-java-6-p)
    254257                          +inherit+
    255258                          (if errorp
     
    269272                            (:append (setf appendp T))
    270273                            ((NIL) (return-from setup-output-redirection))))
    271       (if (not-java-6)
     274      (if (not-java-6-p)
    272275        (if appendp
    273276            (java:jstatic "appendTo" "java.lang.ProcessBuilder$Redirect" file)
    274277            (java:jstatic "to" "java.lang.ProcessBuilder$Redirect" file))
    275278        (list file appendp))))))
    276     (when (not-java-6)
     279    (when (not-java-6-p)
    277280      (if errorp
    278281    (java:jcall "redirectError" process-builder redirect)
     
    369372(defun %process-pid (jprocess)
    370373  (if (ext:os-unix-p)
    371       ;; TODO: memoize this
    372       (let ((field (java:jcall "getDeclaredField" (java:jclass "java.lang.UNIXProcess") "pid")))
     374      (let* ((process-class
     375              (if (pre-java-11-p)
     376                  "java.lang.UNIXProcess"
     377                  "java.lang.ProcessImpl"))
     378             (field
     379               (java:jcall "getDeclaredField" process-class "pid")))
    373380        (java:jcall "setAccessible" field java:+true+)
    374381        (java:jcall "get" field jprocess))
Note: See TracChangeset for help on using the changeset viewer.