Plaster

text
(defmacro read-with-rw-lock ((reader-writer-lock) &body body) (let ((retval (gensym)) (lock (gensym))) `(let ((,retval ,nil) (,lock ,reader-writer-lock)) (with-accessors ((g g-lock) (ww writers-waiting) (c-var condition-var) (ra readers-active)) ,lock (bt:with-lock-held (g) (unwind-protect (while-loop (> ww 0) (bt:condition-wait c-var g)) (unwind-protect (progn (incf ra) (setf ,retval (locally ,@body))) (unless (zerop ra) (decf ra)) (when (zerop ra) (bt:condition-notify c-var)))))) ,retval)))