(defmacro write-with-rw-lock ((lock) &body body) (let ((locked (gensym))) `(let ((,locked nil)) (unwind-protect (when (begin-write ,lock) (prog2 (setf ,locked t) (locally ,@body) (when (end-write ,lock) (setf ,locked nil)))) (when ,locked (end-write ,lock))))))