; .EnTete "Le-Lisp (c) version 15.2" " " "Print GC Infos" ; .EnPied "printgcinfo.ll" "%" " " ; ; .Centre "$Header: printgcinfo.ll,v 1.4 89/01/04 19:17:20 chaillou Exp $" ; Print GC Infos in a more readable way than (GCINFO) ; CAUTION : (print-gcinfo) works only with 32bit pointers Le-Lisp (defvar #:sys-package:colon 'printgcinfo) (defvar :gcinfo-database (list (cons () (gcinfo t)))) (defvar :list-name '(cons symbol string vector float fix heap code)) (defvar :list-size '(10 12 14 16 18 20 22 24)) (defvar :list-cont '(1 2 3 4 5 6 7 ())) ; This line has to be changed if the size of a Lisp pointer is not 32 bits (defvar :list-byte '(8 32 8 8 8 0 1 1)) (de save-gcinfo (name) (if (symbolp name) (setq :gcinfo-database (acons name (gc t) :gcinfo-database)) (error 'save-gcinfo 'errsymb name)) name) (de :get-gcinfo (name) (or (cassq name :gcinfo-database) (cassq () :gcinfo-database))) (de print-gcinfo rest (let ((format1 "~A~7T~4D~14T~8,0F~9,0F~34T~7,0F~9,0F~54T~7,0F~9,0F") (initial-gcinfo (if (symbolp (car rest)) (:get-gcinfo (car rest)) (error 'print-gcinfo 'errsymb (car rest)))) (current-gcinfo (gc t)) (total-call 0) (total-init 0.) (total-used 0.) (total-free 0.)) (prinf "Type~9TCall~20T Init~39T Used~59T Free") (terpri) (prinf "~18Tnb size~37Tnb size~57Tnb size") (terpri) (mapc (lambda (name size byte call) (let* ((ni (:intval (nth size initial-gcinfo) 1)) (init (:intval (nth size initial-gcinfo) byte)) (nf (:intval (nth size current-gcinfo) 1)) (free (:intval (nth size current-gcinfo) byte)) (nu (- ni nf)) (used (- init free)) (call (if call (nth call current-gcinfo) 0))) (incr total-call call) (incr total-init init) (incr total-used used) (incr total-free free) (prinf format1 name call ni init nu used nf free) (terpri))) :list-name :list-size :list-byte :list-cont) (print (format () format1 "Total" total-call 0. total-init 0. total-used 0. total-free))) 'print-gcinfo) (de :intval (n byte) (* (if (consp n) (* (car n) 1024) n) byte))