mail.scm 1.1 KB

1234567891011121314151617181920212223242526272829303132333435
  1. ; Copyright (c) 1993-2008 by Richard Kelsey and Jonathan Rees. See file COPYING.
  2. ; Mailboxes (to be used with the threads package)
  3. (define (make-mailbox)
  4. (vector (make-lock) (make-queue) (make-queue)))
  5. (define (mailbox-lock mbx) (vector-ref mbx 0))
  6. (define (mailbox-messages mbx) (vector-ref mbx 1))
  7. (define (mailbox-readers mbx) (vector-ref mbx 2))
  8. (define (mailbox-empty? mbx)
  9. (queue-empty? (mailbox-readers mbx)))
  10. (define (mailbox-write mbx message)
  11. (with-lock (mailbox-lock mbx)
  12. (lambda ()
  13. (if (queue-empty? (mailbox-readers mbx))
  14. (enqueue! (mailbox-messages mbx) message)
  15. (condvar-set! (dequeue! (mailbox-readers mbx)) message)))))
  16. (define (mailbox-read mbx)
  17. ((with-lock (mailbox-lock mbx)
  18. (lambda ()
  19. (if (queue-empty? (mailbox-messages mbx))
  20. (let ((cv (make-condvar)))
  21. (enqueue! (mailbox-readers mbx) cv)
  22. ;; The condvar-ref *must* happen after lock is released,
  23. ;; otherwise deadlock will result.
  24. (lambda () (condvar-ref cv)))
  25. (let ((message (dequeue! (mailbox-messages mbx))))
  26. (lambda () message)))))))