1 (in-package :locked-queue)
3 (declaim (optimize (space 0) (speed 0) (safety 3) (debug 3)))
5 (defclass locked-queue ()
7 (mutex :initform (sb-thread:make-mutex :name "queue lock"))
8 (waitq :initform (make-waitqueue))))
11 (make-instance 'locked-queue))
13 (defmethod dequeue ((q locked-queue))
14 (with-slots (queue mutex waitq) q
18 (condition-wait waitq mutex))
19 (prog1 (first (car queue))
21 (rest (car queue)))))))
23 (defmethod enqueue ((q locked-queue) value)
24 (with-slots (queue mutex waitq) q
26 (let ((last (list value)))
27 (if (null (first queue))
29 (setf queue (cons last last))
30 (condition-notify waitq))
32 (setf (rest (cdr queue))
35 (cons (car queue) last)))))))