Was fiddling with gambit's c-ffi and noticed that wills I attached to ports made with ##open-predefined weren't executing so I wrote some test code, if there's something wrong with my code please let me know.
# cat fdes.scm
(c-declare #<<c-declare-end
#include <sys/stat.h> #include <fcntl.h> #include <unistd.h>
c-declare-end )
(define-macro (c-macro var) `(define ,var ((c-lambda () int ,(string-append "___return(" (symbol->string var) ");")))))
;; posix open flags (c-macro O_RDONLY) (c-macro O_WRONLY) (c-macro O_RDWR) (c-macro O_CREAT)
;; filename flags mode -> fdes | -1 (define posix-open (c-lambda (nonnull-char-string int int) int "open")) ;; fdes -> 0 | -1 (define posix-close (c-lambda (int) int "close"))
(define in 1) (define out 2) (define inout 3)
;;; ;;; The will only executes if direction is in
(define (test-posix-open filename direction) (let* ((fd (case direction ((1) (posix-open filename (bitwise-ior O_RDONLY O_CREAT) #o755)) ((2) (posix-open filename (bitwise-ior O_WRONLY O_CREAT) #o755)) ((3) (posix-open filename (bitwise-ior O_RDWR O_CREAT) #o755)))) (port (##open-predefined direction filename fd))) (println "fd: " fd " port: " port) (make-will port (lambda (p) (println "[WILL] closing port " p) (posix-close fd)))) (##gc))
;;; when run with direction other than in this eats up all my ram
(define (test-loop filename direction) (let ((fd (case direction ((1) (posix-open filename (bitwise-ior O_RDONLY O_CREAT) #o755)) ((2) (posix-open filename (bitwise-ior O_WRONLY O_CREAT) #o755)) ((3) (posix-open filename (bitwise-ior O_RDWR O_CREAT) #o755))))) (let loop () (##open-predefined direction filename fd) (loop))))