(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)))
This hack provides an extension to Arc’s atomic by providing individual locks. Only one thread at a time will execute inside of an atomic-lock with a given lock, but threads calling atomic-lock with different locks will not affect each other.
Individual locks are useful when you’re performing I/O inside of the locked code, and you don’t want other unrelated threads to hang waiting for your I/O to complete.
This hack depends on arc3.1 and scheme0.
Same as Arc.