Ticket #1030 (closed defect: fixed)
Failure with conditional-store
| Reported by: | jlawrence | Owned by: | gb |
|---|---|---|---|
| Priority: | normal | Milestone: | |
| Component: | Runtime (threads, GC) | Version: | trunk |
| Keywords: | Cc: |
Description
(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 ".")))
Change History
Note: See
TracTickets for help on using
tickets.
