X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=tests%2Fcompare-and-swap.impure.lisp;h=e35b56d94ac1cb73daedc546c758b45699b256a6;hb=880a863592743d82835e0fb4395301d6ab1f5127;hp=8a034adf3c38a659d7e71d407cef4990d62d48d9;hpb=db9c81e7b9a67ebd26b87bf2c1686d1b4968f097;p=sbcl.git diff --git a/tests/compare-and-swap.impure.lisp b/tests/compare-and-swap.impure.lisp index 8a034ad..e35b56d 100644 --- a/tests/compare-and-swap.impure.lisp +++ b/tests/compare-and-swap.impure.lisp @@ -104,3 +104,36 @@ (handler-case (sb-ext:compare-and-swap (symbol-value name) t 42) (error () :error))))) + +;;;; ATOMIC-INCF (we should probably rename this file atomic-ops...) + +(defstruct box + (word 0 :type sb-vm:word)) + +(defun inc-box (box n) + (declare (fixnum n) (box box)) + (loop repeat n + do (sb-ext:atomic-incf (box-word box)))) + +(defun dec-box (box n) + (declare (fixnum n) (box box)) + (loop repeat n + do (sb-ext:atomic-incf (box-word box) -1))) + +(let ((box (make-box))) + (inc-box box 10000) + (assert (= 10000 (box-word box))) + (dec-box box 10000) + (assert (= 0 (box-word box)))) + +#+sb-thread +(let* ((box (make-box)) + (threads (loop repeat 64 + collect (sb-thread:make-thread (lambda () + (inc-box box 1000) + (dec-box box 10000) + (inc-box box 10000) + (dec-box box 1000)) + :name "inc/dec thread")))) + (mapc #'sb-thread:join-thread threads) + (assert (= 0 (box-word box))))