Simple mailbox implementation added by crzcrz on Tue Sep 29 12:44:31 2026

(import queues)
(import srfi-18)

(define (make-mailbox #!optional name)
    (let ((queue (make-queue))
          (mutex (make-mutex name))
          (cv (make-condition-variable name)))

      (define (send msg)
        (mutex-lock! mutex)
        (queue-add! queue msg)
        (condition-variable-signal! cv)
        (mutex-unlock! mutex)
        (void))

      (define (recv timeout)
        (mutex-lock! mutex)
        (if (queue-empty? queue)
            (if (mutex-unlock! mutex cv timeout)
                (recv timeout)
                #f)
            (let ((msg (queue-remove! queue)))
              (mutex-unlock! mutex)
              msg)))

      (lambda (op . args)
        (case op
          [(send) (apply send args)]
          [(recv) (apply recv args)]
          [else (error 'mailbox "unknown op" op)]))))