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
16 (loop while (or (null queue)
18 do (condition-wait waitq mutex))
19 (prog1 (first (car queue))
21 (rest (car queue)))))))
23 (defmethod dequeue-all ((q locked-queue))
24 (with-slots (queue mutex waitq) q
28 (condition-wait waitq mutex))
30 until (null (car queue))
31 collect (car (car queue))
32 do (setf (car queue) (rest (car queue)))))))
34 (defmethod enqueue ((q locked-queue) value)
35 (with-slots (queue mutex waitq) q
37 (let ((last (list value)))
38 (if (null (first queue))
40 (setf queue (cons last last))
41 (condition-notify waitq))
43 (setf (rest (cdr queue)) last
45 (cons (car queue) last)))))))