1.0.37.23: saner SB-PROFILE::COUNTER-COUNT handling
authorNikodemus Siivola <nikodemus@random-state.net>
Fri, 2 Apr 2010 15:34:56 +0000 (15:34 +0000)
committerNikodemus Siivola <nikodemus@random-state.net>
Fri, 2 Apr 2010 15:34:56 +0000 (15:34 +0000)
 * Each overflow accounts for (1+ +MOST-POSITIVE-WORD+) instead of
   +MOST-POSITIVE-WORD+, just like in

     0x01 + [0x00,0xff] = [0x01,0x00]

   ...one less ATOMIC-INCF needed for the overflow case.

src/code/profile.lisp
version.lisp-expr

index 0e25d32..59929eb 100644 (file)
                ;; overflow.
                (let ((prev (atomic-incf (counter-word counter) d)))
                  (when (< (logand +most-positive-word+ (+ prev d)) prev)
-                   (%incf-overflow)
-                   (atomic-incf (counter-word counter))))))
+                   (%incf-overflow)))))
       ;; DELTA can potentially be a bignum -- cut it down to word-size.
       (unless (typep delta 'sb-vm:word)
-        (multiple-value-bind (n r) (truncate delta +most-positive-word+)
+        (multiple-value-bind (n r) (truncate delta (1+ +most-positive-word+))
           (%incf-overflow n)
           (setf delta r)))
       ;; ATOMIC-INCF can at most handle SIGNED-WORD: if DELTA doesn't fit that,
@@ -58,8 +57,7 @@
 
 (defun counter-count (counter)
   (+ (counter-word counter)
-     (* (counter-overflow counter)
-        +most-positive-word+)))
+     (* (counter-overflow counter) (1+ +most-positive-word+))))
 \f
 ;;;; High resolution timer
 
index a685eb9..3d8bc36 100644 (file)
@@ -17,4 +17,4 @@
 ;;; 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.37.22"
+"1.0.37.23"