X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=tests%2Fcompare-and-swap.impure.lisp;h=e16e0cb86dc610e00a0a3f27c85b36be072db884;hb=a566e334e16d9cd0ff4f6858d796442305fd0f99;hp=da4e2c95c69bd4e9b9a491a567a2e5486e40c000;hpb=31a5540ef1bbe9bb9d31330beb3151d4f93287f4;p=sbcl.git diff --git a/tests/compare-and-swap.impure.lisp b/tests/compare-and-swap.impure.lisp index da4e2c9..e16e0cb 100644 --- a/tests/compare-and-swap.impure.lisp +++ b/tests/compare-and-swap.impure.lisp @@ -3,7 +3,7 @@ (defstruct xxx yyy) (macrolet ((test (init op) - `(with-test (:name (:cas :basics ,op)) + `(with-test (:name (:cas :basics ,(intern (symbol-name op) "KEYWORD"))) (let ((x ,init) (y (list 'foo)) (z (list 'bar))) @@ -120,6 +120,10 @@ (defstruct box (word 0 :type sb-vm:word)) +;; Have the following tests check that CAS access to the superclass +;; works in the presence of a subclass sharing the conc-name. +(defstruct (subbox (:include box) (:conc-name "BOX-"))) + (defun inc-box (box n) (declare (fixnum n) (box box)) (loop repeat n @@ -412,3 +416,36 @@ (assert (eq :bar (eval `(let (,@(mapcar 'list vars vals)) ,read-form))))))) + +(let ((foo (cons :foo nil))) + (defun cas-foo (old new) + (cas (cdr foo) old new))) + +(defcas foo () cas-foo) + +(with-test (:name :cas-and-macroexpansion) + (assert (not (cas (foo) nil t))) + (assert (eq t (cas (foo) t nil))) + (symbol-macrolet ((bar (foo))) + (assert (not (cas bar nil :ok))) + (assert (eq :ok (cas bar :ok nil))) + (assert (not (cas bar nil t))))) + +(with-test (:name :atomic-push + :skipped-on '(not :sb-thread)) + (let ((store (cons nil nil)) + (n 100000)) + (symbol-macrolet ((x (car store)) + (y (cdr store))) + (dotimes (i n) + (push i y)) + (mapc #'sb-thread:join-thread + (loop repeat (ecase sb-vm:n-word-bits (32 100) (64 1000)) + collect (sb-thread:make-thread + (lambda () + (loop for z = (atomic-pop y) + while z + do (atomic-push z x) + (sleep 0.00001)))))) + (assert (not y)) + (assert (eql n (length x))))))