1.0.22.11: name *pcl-lock*
[sbcl.git] / src / pcl / cache.lisp
index 3204dbe..73c197b 100644 (file)
   ;; bits at the low end.
   (logand (1- vector-length) (- line-size)))
 
-;;; The smallest power of two that is equal to or greater then X.
-(declaim (inline power-of-two-ceiling))
-(defun power-of-two-ceiling (x)
-  (ash 1 (integer-length (1- x))))
-
 (defun cache-statistics (cache)
   (let* ((vector (cache-vector cache))
          (size (length vector))
         ;; Make a smaller one, then
         (make-cache :key-count key-count :value value :size (ceiling size 2)))))
 
+(defconstant n-fixnum-bits #.(integer-length most-positive-fixnum))
+
 ;;;; Copies and expands the cache, dropping any invalidated or
 ;;;; incomplete lines.
 (defun copy-and-expand-cache (cache layouts value)
                       ;; analysis...
                       (flet ((random-fixnum ()
                                (random (1+ most-positive-fixnum))))
-                        (let ((drops (random-fixnum)))
-                          (declare (fixnum drops))
+                        (let ((drops (random-fixnum))
+                              (drop-pos n-fixnum-bits))
+                          (declare (fixnum drops)
+                                   (type (integer 0 #.n-fixnum-bits) drop-pos))
                           (lambda (layouts value)
-                            (when (logbitp 0 drops)
+                            (when (logbitp (the unsigned-byte (decf drop-pos)) drops)
                               (try-update-cache copy layouts value))
-                            (when (zerop (ash drops -1))
-                              (setf drops (random-fixnum))))))
+                            (when (zerop drop-pos)
+                              (setf drops (random-fixnum)
+                                    drop-pos n-fixnum-bits)))))
                       (lambda (layouts value)
                         (unless (try-update-cache copy layouts value)
                           ;; Didn't fit -- expand the cache, or drop