13 (define (cell val prev next)
16 (define cell-prev cadr)
17 (define cell-next caddr)
18 (define (set-cell-prev! cell prev-cell)
19 (set-car! (cdr cell) prev-cell))
20 (define (set-cell-next! cell next-cell)
21 (set-car! (cddr cell) next-cell))
25 (pop-mutex (make-mutex)))
26 (mutex-lock! pop-mutex #f #f)
29 ((empty?) (null? head))
31 (if (not (null? head))
32 (let ((old-head head))
33 (set! head (cell (car args) '() old-head))
34 (set-cell-prev! old-head head))
37 (set! head (cell (car args) '() '()))
39 (mutex-unlock! pop-mutex))))
41 (mutex-lock! pop-mutex #f #f)
44 (let ((old-tail tail))
45 (set! tail (cell-prev old-tail))
49 (set-cell-next! tail '())
50 (mutex-unlock! pop-mutex #f #f)))
51 (cell-val old-tail)))))
52 ((->list) (if (not (= (length args) 0))
53 (error "Wrong number of arguments to ->list.")
54 (let loop ((this-cell head))
57 (cons (cell-val this-cell)
58 (loop (cell-next this-cell))))))))))
61 (define (fifo-push fifo x)
64 (define (fifo-pop fifo)
67 (define (fifo-empty? fifo)
70 (define (fifo->list fifo)