X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fpcl%2Fcache.lisp;h=73c197bda28c097824ad77ab3572bc10f0a969dd;hb=d25e3478acccec70402ff32554669a982be8e281;hp=3204dbef49fbafb934cf283ad06569bf385e5301;hpb=229d5b35ac98f606f24c90d8e5cc037cae3829cd;p=sbcl.git diff --git a/src/pcl/cache.lisp b/src/pcl/cache.lisp index 3204dbe..73c197b 100644 --- a/src/pcl/cache.lisp +++ b/src/pcl/cache.lisp @@ -104,11 +104,6 @@ ;; 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)) @@ -322,6 +317,8 @@ ;; 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) @@ -362,13 +359,16 @@ ;; 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