(def lock () (obj sema (scheme.make-semaphore 1) nest (scheme.make-thread-cell nil))) (def atomic-lock-invoke (lock thunk) (if (scheme.thread-cell-ref lock!nest) (thunk) (do ((scheme thread-cell-set!) lock!nest t) (after (scheme.call-with-semaphore lock!sema thunk) ((scheme thread-cell-set!) lock!nest nil))))) (mac atomic-lock (lock . body) `(atomic-lock-invoke ,lock (fn () ,@body)))