;; Message-Queues für je einen Producer/Consumer (define-record-type :mqueue (really-make-mqueue front rear semaphore) mqueue? (front mqueue-front set-mqueue-front!) (rear mqueue-rear set-mqueue-rear!) (semaphore mqueue-semaphore)) (define *nothing* (list '*nothing*)) (define (make-mqueue) (let ((pair (cons *nothing* '()))) (really-make-mqueue pair pair (make-semaphore 0)))) (define (add-to-mqueue! mqueue value) (let ((pair (cons value '()))) (set-cdr! (mqueue-rear mqueue) pair) (set-mqueue-rear! mqueue pair)) (semaphore-post (mqueue-semaphore mqueue))) (define (remove-from-mqueue mqueue) (semaphore-wait (mqueue-semaphore mqueue)) (let* ((front (mqueue-front mqueue)) (next (cdr front)) (value (car next))) (set-mqueue-front! mqueue next) (set-car! next (car front)) value))