(import (chicken process signal)) (import srfi-18) (define (make-handler cv msg) (lambda (signum) (print msg " signal") (condition-variable-specific-set! cv 'break) (condition-variable-signal! cv))) (let [(m (make-mutex)) (cv (make-condition-variable))] (condition-variable-specific-set! cv 'hold) (set-signal-handler! signal/int (make-handler cv "INT")) (thread-start! (lambda () (sleep 4) (condition-variable-specific-set! cv 'break) (condition-variable-signal! cv))) (let loop () (print "+ loop") (mutex-lock! m) (print "+ unlock") (mutex-unlock! m cv) (when (equal? 'hold (condition-variable-specific cv)) (loop)) (print "done")))