(in-package "SB!IMPL")
-(defmacro atomic-incf/symbol (symbol-name &optional (delta 1))
- #!-sb-thread
- `(incf ,symbol-name ,delta)
- #!+sb-thread
- `(locally
- (declare (optimize (safety 0) (speed 3)))
- (sb!vm::locked-symbol-global-value-add ',symbol-name ,delta)))
-
;;;; these are initialized in cold init
(defvar *in-without-gcing*)
(:policy :fast)
(:translate symbol-value))
-(defknown locked-symbol-global-value-add (symbol fixnum) fixnum ())
-
-(define-vop (locked-symbol-global-value-add)
- (:args (object :scs (descriptor-reg) :to :result)
- (value :scs (any-reg) :target result))
- (:arg-types * tagged-num)
- (:results (result :scs (any-reg) :from (:argument 1)))
- (:policy :fast)
- (:translate locked-symbol-global-value-add)
- (:result-types tagged-num)
- (:policy :fast-safe)
- (:generator 4
- (move result value)
- (inst add (make-ea :qword :base object
- :disp (- (* symbol-value-slot n-word-bytes)
- other-pointer-lowtag))
- value :lock)))
-
#!+sb-thread
(define-vop (boundp)
(:translate boundp)
(:policy :fast)
(:translate symbol-value))
-(defknown locked-symbol-global-value-add (symbol fixnum) fixnum ())
-
-(define-vop (locked-symbol-global-value-add)
- (:args (object :scs (descriptor-reg) :to :result)
- (value :scs (any-reg) :target result))
- (:arg-types * tagged-num)
- (:results (result :scs (any-reg) :from (:argument 1)))
- (:policy :fast)
- (:translate locked-symbol-global-value-add)
- (:result-types tagged-num)
- (:policy :fast-safe)
- (:generator 4
- (move result value)
- (inst add (make-ea-for-object-slot object symbol-value-slot
- other-pointer-lowtag)
- value :lock)))
-
#!+sb-thread
(define-vop (boundp)
(:translate boundp)
(format t "~&interrupt test done~%")
-(defparameter *interrupt-count* 0)
+(defstruct counter (n 0 :type sb-vm:word))
+(defvar *interrupt-counter* (make-counter))
(declaim (notinline check-interrupt-count))
(defun check-interrupt-count (i)
(princ cond)
(sb-debug:backtrace
most-positive-fixnum))))
- (loop (check-interrupt-count *interrupt-count*)))))))
+ (loop (check-interrupt-count (counter-n *interrupt-counter*))))))))
(let ((func (lambda ()
(princ ".")
(force-output)
- (sb-impl::atomic-incf/symbol *interrupt-count*))))
- (setq *interrupt-count* 0)
+ (sb-ext:atomic-incf (counter-n *interrupt-counter*)))))
+ (setf (counter-n *interrupt-counter*) 0)
(dotimes (i 100)
(sleep (random 0.1d0))
(interrupt-thread c func))
- (loop until (= *interrupt-count* 100) do (sleep 0.1))
+ (loop until (= (counter-n *interrupt-counter*) 100) do (sleep 0.1))
(terminate-thread c)
(wait-for-threads (list c))))
;;; checkins which aren't released. (And occasionally for internal
;;; versions, especially for internal versions off the main CVS
;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
-"1.0.28.25"
+"1.0.28.26"