;;; -*- Scheme -*- (declare (usual-integrations)) ;;;; Message queues (define (make-empty-queue tag) (let ((data (list tag))) (cons data data))) (define-integrable (queue/items q) (car q)) (define-integrable (queue/last q) (cdr q)) (define-integrable (set-queue/last! q item) (set-cdr! q item)) (define (queue/empty? q) (eq? (queue/items q) (queue/last q))) (define (queue/add! q item) ;; make sure this executes atomically (let ((last-element (list item))) (set-cdr! (queue/last q) last-element) (set-queue/last! q last-element) q)) (define (queue/remove! q) ;; make sure this executes atomically (let ((data (queue/items q))) (let ((msg (cadr data))) (if (eq? (cdr data) (queue/last q)) (set-queue/last! q data)) (set-cdr! data (cddr data)) msg))) (define (queue/length q) ;; subtract 1 for the tag (- (length (queue/items q)) 1))