X-Git-Url: http://git.pond.sub.org/?p=eow;a=blobdiff_plain;f=locked-queue.lisp;h=d225faccc7e7242eb998dcfe897802e70efe3da8;hp=66f435452abff46c4fc7fd1a514be45fe72d7c24;hb=2b5038255fc269672013708493156c6cebc1ffc6;hpb=bf4c8fd00a49cef4ce907a341722347e640ff83b diff --git a/locked-queue.lisp b/locked-queue.lisp index 66f4354..d225fac 100644 --- a/locked-queue.lisp +++ b/locked-queue.lisp @@ -20,6 +20,17 @@ (setf (car queue) (rest (car queue))))))) +(defmethod dequeue-all ((q locked-queue)) + (with-slots (queue mutex waitq) q + (with-mutex (mutex) + (if (or (null queue) + (null (first queue))) + (condition-wait waitq mutex)) + (loop + until (null (car queue)) + collect (car (car queue)) + do (setf (car queue) (rest (car queue))))))) + (defmethod enqueue ((q locked-queue) value) (with-slots (queue mutex waitq) q (with-mutex (mutex) @@ -29,7 +40,6 @@ (setf queue (cons last last)) (condition-notify waitq)) (progn - (setf (rest (cdr queue)) - last + (setf (rest (cdr queue)) last (cdr queue) last) (cons (car queue) last)))))))