Ticket #1030 (closed defect: fixed)
Failure with conditional-store
|Reported by:||jlawrence||Owned by:||gb|
|Component:||Runtime (threads, GC)||Version:||trunk|
(This is assuming ccl::conditional-store should work as a typical compare-and-swap, even though it's not exported.)
The RUN function below causes an assertion failure within 2000 iterations on my Linux-x86 machine. An svref place has the same issue. I did not see a problem on Darwin.
Removing the assertion (but keeping the conditional-store) results in a hang. Replacing that conditional-store (the second one) with setf also produces a hang.
(defstruct stack (head nil) (lock nil)) (defun call-with-spin-lock (stack fn) (loop :until (ccl::conditional-store (stack-lock stack) nil t)) (unwind-protect (funcall fn) (assert (ccl::conditional-store (stack-lock stack) t nil)))) (defmacro with-spin-lock ((stack) &body body) `(call-with-spin-lock ,stack (lambda () ,@body))) (defun push-stack (value stack) (with-spin-lock (stack) (push value (stack-head stack)))) (defun pop-stack (stack) (with-spin-lock (stack) (pop (stack-head stack)))) (defun test (thread-count) (let ((stack (make-stack))) (loop :repeat thread-count :do (ccl:process-run-function "test" #'push-stack t stack)) (loop :repeat thread-count :do (loop :until (pop-stack stack))))) (defun run () (loop (test 1) (format t ".")))