;; Producer/Consumer-Puffer mit Lock-Conditions (define-record-type :buffer (really-make-buffer data lock available empty) buffer? (data buffer-data set-buffer-data!) (lock buffer-lock) (available buffer-available) (empty buffer-empty)) (define (make-buffer) (let ((lock (make-lock))) (really-make-buffer #f lock (make-lock-condition 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-empty buffer)) (loop))) (else (set-buffer-data! buffer value) (signal-lock-condition (buffer-available buffer)))))))) (define (remove buffer) (with-lock (buffer-lock buffer) (lambda () (let loop () (cond ((buffer-data buffer) => (lambda (value) (set-buffer-data! buffer #f) (signal-lock-condition (buffer-empty buffer)) value)) (else (wait-lock-condition (buffer-available buffer)) (loop)))))))