;; Producer/Consumer-Puffer mit Lock-Conditions (define-record-type :buffer (really-make-buffer data lock cond-lock) buffer? (data buffer-data set-buffer-data!) (lock buffer-lock) (cond-lock buffer-cond-lock)) (define (make-buffer) (let ((lock (make-lock))) (really-make-buffer #f lock (make-lock-condition lock)))) (define (with-lock lock thunk) (obtain-lock lock) (let ((value (thunk))) (release-lock lock) value)) (define (insert buffer value) (with-lock (buffer-lock buffer) (lambda () (let loop () (cond ((buffer-data buffer) => (lambda (ignore) (wait-lock-condition (buffer-cond-lock buffer)) (loop))) (else (set-buffer-data! buffer value) (broadcast-lock-condition (buffer-cond-lock buffer)))))))) (define (remove buffer) (with-lock (buffer-lock buffer) (lambda () (let loop () (cond ((buffer-data buffer) => (lambda (value) (set-buffer-data! buffer #f) (broadcast-lock-condition (buffer-cond-lock buffer)) value)) (else (wait-lock-condition (buffer-cond-lock buffer)) (loop)))))))