;; my tests: ;; 2015 klm@kth /s/p/a/a/s/ais-sse ➤ csi -version ;; ;; CHICKEN ;; (c) 2008-2017, The CHICKEN Team ;; (c) 2000-2007, Felix L. Winkelmann ;; Version 4.12.0 (rev 6ea24b6) ;; linux-unix-gnu-x86-64 [ 64bit manyargs dload ptables ] ;; compiled 2017-02-19 on yves.more-magic.net (Linux) ;; ;; 2016 klm@kth /s/p/a/a/s/ais-sse ➤ csi -s weak-test.scm ;; locking mutex ;; unlocking mutex ... ;; weak locative: #(123) ;; weak locative: #f ;; weak locative: #f ;; weak locative: #f ;; ^C ;; *** user interrupt *** ;; ;; if I remove srfi-13 import, it works: ;; ;; 2017 klm@kth /s/p/a/a/s/ais-sse ➤ cat weak-test.scm | csi -p '(read)' ;; (use srfi-18 lolevel) ;; 2017 klm@kth /s/p/a/a/s/ais-sse ➤ csi -s weak-test.scm ;; locking mutex ;; unlocking mutex ... ;; weak locative: #(123) ;; weak locative: #(123) ;; weak locative: #(123) ;; weak locative: #(123) ;; ^C ;; *** user interrupt *** ;; ;; ;; I think the reason that the amound of imports affects the ;; weak-locatives is because it changes the top-level environment ;; somehow. (use srfi-13 ;; <-- killer import (any import will breaks things, try srfi-4 too for example) srfi-18 lolevel) (define wl #f) (thread-start! (lambda () (define mutex (make-mutex)) (define cv (make-condition-variable)) (print "locking mutex") (mutex-lock! mutex) (let ((REFERENCE (vector 123))) (set! wl (make-weak-locative REFERENCE)) (print "unlocking mutex ...") (mutex-unlock! mutex cv) (print "unlocked!") (print "DONE (REFERENCE may now be out of scope) " REFERENCE)))) (thread-start! (lambda () (let loop () (print "weak locative: " (locative->object wl)) (thread-sleep! 1) (gc #t) (loop)))) (thread-sleep! 10)