Commits

Peter Bex committed 989e400

Revert back to standard-extension and include a type declaration override for scsh-process to fix bogus optimization of 'signal-handler' due to invalid scrutiny type

  • Participants
  • Parent commits 8125868

Comments (0)

Files changed (2)

File scsh-process.scm

 
   (set-signal-handler!
    signal/chld
-   (let ((old-handler (signal-handler signal/chld)))
-     (lambda (signal)
-       (for-each (lambda (pid)
-                   (handle-exceptions exn
-                     ;; User might have waited manually
-                     (begin (remove-scsh-pending-process! pid) (void))
-                     (receive (pid ok? status)
-                       (posix-process-wait pid #t)
-                       (unless (zero? pid)
-                         (let ((p (hash-table-ref *scsh-pending-processes* pid)))
-                           (scsh-process-exit-status-set! p status)
-                           (scsh-process-ok?-set! p ok?)
-                           ;; The GC can clean it up
-                           (remove-scsh-pending-process! pid))))))
-                 (hash-table-keys *scsh-pending-processes*))
-       (when old-handler (old-handler signal))))))
+   ;; This workaround fixes the "signal-hander" type in the types.db of 4.8.0
+   (let-syntax ((workaround
+                 (cond-expand
+                  (chicken-4.8
+                   (syntax-rules ()
+                     ((_ val) (the (or boolean (procedure (fixnum) . *)) val))))
+                  (else (syntax-rules () ((_ val) val))))))
+     (let ((old-handler (workaround (signal-handler signal/chld))))
+       (lambda (signal)
+         (for-each (lambda (pid)
+                     (handle-exceptions exn
+                       ;; User might have waited manually
+                       (begin (remove-scsh-pending-process! pid) (void))
+                       (receive (pid ok? status)
+                         (posix-process-wait pid #t)
+                         (unless (zero? pid)
+                           (let ((p (hash-table-ref *scsh-pending-processes* pid)))
+                             (scsh-process-exit-status-set! p status)
+                             (scsh-process-ok?-set! p ok?)
+                             ;; The GC can clean it up
+                             (remove-scsh-pending-process! pid))))))
+                   (hash-table-keys *scsh-pending-processes*))
+         (when old-handler (old-handler signal)))))))
 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

File scsh-process.setup

 ;; -*- Scheme -*-
 
-;; Can't use standard-extension for now; 4.8.0's standard-extension uses -O3
-;; which implies -specialize.  This generates code that causes a segfault.
-(compile -s -O2 -d1 scsh-process.scm -j scsh-process)
-(compile -s -O2 -d0 scsh-process.import.scm)
- 
-(install-extension
- 'scsh-process
- '("scsh-process.so" "scsh-process.import.so")
- '((version "0.2.1")))
+(standard-extension 'scsh-process "0.2.1")