1.0.37.8: add ATOMIC-DECF, fix WAIT-ON-SEMAPHORE-BUGLET
[sbcl.git] / tests / compare-and-swap.impure.lisp
index e35b56d..accb74f 100644 (file)
            (sb-ext:compare-and-swap (symbol-value name) t 42)
          (error () :error)))))
 
-;;;; ATOMIC-INCF (we should probably rename this file atomic-ops...)
+;;;; ATOMIC-INCF and ATOMIC-DECF (we should probably rename this file atomic-ops...)
 
 (defstruct box
   (word 0 :type sb-vm:word))
 (defun dec-box (box n)
   (declare (fixnum n) (box box))
   (loop repeat n
-        do (sb-ext:atomic-incf (box-word box) -1)))
+        do (sb-ext:atomic-decf (box-word box))))
 
 (let ((box (make-box)))
   (inc-box box 10000)
   (dec-box box 10000)
   (assert (= 0 (box-word box))))
 
+(with-test (:name :atomic-incf-wraparound)
+  (let ((box (make-box :word (1- (ash 1 sb-vm:n-word-bits)))))
+    (sb-ext:atomic-incf (box-word box) 2)
+    (assert (= 1 (box-word box)))))
+
+(with-test (:name :atomic-decf-wraparound)
+  (let ((box (make-box :word 0)))
+    (sb-ext:atomic-decf (box-word box) 2)
+    (assert (= (- (ash 1 sb-vm:n-word-bits) 2) (box-word box)))))
+
 #+sb-thread
 (let* ((box (make-box))
        (threads (loop repeat 64