X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Fpcounter.lisp;h=aee1cad2631214ae7ce0ab97eebc4aae612426b1;hb=a160917364f85b38dc0826a5e3dcef87e3c4c62c;hp=cfd74215391cd532a1c63e71584a3e4765043507;hpb=f3af39f1a29391c2cc9f3308bc0a9ea6d39fb8eb;p=sbcl.git diff --git a/src/code/pcounter.lisp b/src/code/pcounter.lisp index cfd7421..aee1cad 100644 --- a/src/code/pcounter.lisp +++ b/src/code/pcounter.lisp @@ -3,43 +3,36 @@ ;;;; a PCOUNTER is used to represent an unsigned integer quantity which ;;;; can grow bigger than a fixnum, but typically does so, if at all, ;;;; in many small steps, where we don't want to cons on every step. -;;;; Such quantities typically arise in profiling, e.g. +;;;; Such quantities typically arise in profiling, e.g. ;;;; total system consing, time spent in a profiled function, and ;;;; bytes consed in a profiled function are all examples of such ;;;; quantities. The name is an abbreviation for "Profiling COUNTER". ;;;; -;;;; It's not one of my more brilliant names, if you have a better -;;;; suggestion, I might be interested. -- WHN 2001-06-22 +;;;; (This isn't one of my more brilliant names, so if you have a +;;;; better suggestion, let me know. -- WHN 2001-06-22) -(in-package "SB!IMPL") +;;; This stuff is implemented in the SB!PROFILE because the profiling +;;; code is currently the only code which wants to poke around in the +;;; implementation details. +(in-package "SB!PROFILE") ;;;; basic PCOUNTER stuff -(/show0 "pcounter.lisp 16") +(/show0 "pcounter.lisp 21") -(defstruct (pcounter (:copier nil)) - (integer 0);; :type unsigned-byte) - (fixnum 0));; :type (and fixnum unsigned-byte))) - -(/show0 "pcounter.lisp 22") - -(declaim (ftype (function (pcounter unsigned-byte) pcounter) incf-pcounter)) -;;;(declaim (inline incf-pcounter)) ; FIXME: maybe inline when more stable +(declaim (maybe-inline incf-pcounter)) (defun incf-pcounter (pcounter delta) (aver (typep delta 'unsigned-byte)) (let ((sum (+ (pcounter-fixnum pcounter) delta))) - (aver (typep sum 'unsigned-byte)) - ;;(declare (type unsigned-byte sum)) (cond ((typep sum 'fixnum) - (setf (pcounter-fixnum pcounter) sum)) - (t - (incf (pcounter-integer pcounter) sum) - (setf (pcounter-fixnum pcounter) 0)))) + (setf (pcounter-fixnum pcounter) sum)) + (t + (incf (pcounter-integer pcounter) sum) + (setf (pcounter-fixnum pcounter) 0)))) pcounter) -(/show0 "pcounter.lisp 36") +(/show0 "pcounter.lisp 34") -(declaim (ftype (function (pcounter) integer) pcounter->integer)) ;;;(declaim (inline pcounter->integer)) ; FIXME: maybe inline when more stable (defun pcounter->integer (pcounter) (+ (pcounter-integer pcounter) @@ -51,23 +44,22 @@ ;;;; start with a FIXNUM counter and only create a PCOUNTER if the ;;;; FIXNUM overflows. -(/show0 "pcounter.lisp 50") +(/show0 "pcounter.lisp 47") -(declaim (ftype (function ((or pcounter fixnum) integer) (or pcounter fixnum)) %incf-pcounter-or-fixnum)) -;;;(declaim (inline %incf-pcounter-or-fixnum)) ; FIXME: maybe inline when more stable +(declaim (inline %incf-pcounter-or-fixnum)) (defun %incf-pcounter-or-fixnum (x delta) (etypecase x (fixnum (let ((sum (+ x delta))) (if (typep sum 'fixnum) - sum - (make-pcounter :integer sum)))) + sum + (make-pcounter :integer sum)))) (pcounter (incf-pcounter x delta)))) - + (define-modify-macro incf-pcounter-or-fixnum (delta) %incf-pcounter-or-fixnum) -(/show0 "pcounter.lisp 64") +(/show0 "pcounter.lisp 62") ;;; Trade off space for execution time by handling the common fast ;;; (TYPEP DELTA 'FIXNUM) case inline and only calling generic @@ -78,12 +70,11 @@ (aver (typep ,delta-sym 'unsigned-byte)) ;;(declare (type unsigned-byte ,delta-sym)) (if (typep ,delta-sym 'fixnum) - (incf-pcounter-or-fixnum ,x ,delta) - (incf-pcounter-or-fixnum ,x ,delta))))) + (incf-pcounter-or-fixnum ,x ,delta) + (incf-pcounter-or-fixnum ,x ,delta))))) -(/show0 "pcounter.lisp 80") +(/show0 "pcounter.lisp 76") -(declaim (ftype (function ((or pcounter fixnum)) integer) pcounter-or-fixnum->integer)) (declaim (maybe-inline pcounter-or-fixnum->integer)) (defun pcounter-or-fixnum->integer (x) (etypecase x