X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Fgc.lisp;h=020eab8c8647a774ebefd62efdede97fa9a94ac8;hb=ce02ab2ecd9c6ae2e570abd8c93ebf3be55bbdad;hp=a2ad5f54d3f393adba43432fca1b5186a77d943b;hpb=5f338d314224411587a7cac218ea320bc982f19f;p=sbcl.git diff --git a/src/code/gc.lisp b/src/code/gc.lisp index a2ad5f5..020eab8 100644 --- a/src/code/gc.lisp +++ b/src/code/gc.lisp @@ -10,9 +10,6 @@ ;;;; files for more information. (in-package "SB!KERNEL") - -(file-comment - "$Header$") ;;;; DYNAMIC-USAGE and friends @@ -39,13 +36,13 @@ (defun control-stack-usage () #!-x86 (- (sb!sys:sap-int (sb!c::control-stack-pointer-sap)) - control-stack-start) - #!+x86 (- control-stack-end + sb!vm:control-stack-start) + #!+x86 (- sb!vm:control-stack-end (sb!sys:sap-int (sb!c::control-stack-pointer-sap)))) (defun binding-stack-usage () (- (sb!sys:sap-int (sb!c::binding-stack-pointer-sap)) - (sb!vm:binding-stack-start))) + sb!vm:binding-stack-start)) ;;;; ROOM @@ -171,9 +168,13 @@ #!+sb-doc "The total CPU time spent doing garbage collection (as reported by GET-INTERNAL-RUN-TIME.)") - (declaim (type index *gc-run-time*)) +;;; a limit to help catch programs which allocate too much memory, +;;; since a hard heap overflow is so hard to recover from. +(declaim (type (or unsigned-byte null) *soft-heap-limit*)) +(defvar *soft-heap-limit* nil) + ;;; Internal trigger. When the dynamic usage increases beyond this ;;; amount, the system notes that a garbage collection needs to occur by ;;; setting *NEED-TO-COLLECT-GARBAGE* to T. It starts out as NIL meaning @@ -277,7 +278,21 @@ (/show0 "not *ALREADY-MAYBE-GCING*") (let* ((*already-maybe-gcing* t) (start-time (get-internal-run-time)) - (pre-gc-dyn-usage (dynamic-usage))) + (pre-gc-dyn-usage (dynamic-usage)) + ;; Currently we only check *SOFT-HEAP-LIMIT* at GC time, + ;; not for every allocation. That makes it cheap to do, + ;; even if it is a little ugly. + (soft-heap-limit-exceeded? (and *soft-heap-limit* + (> pre-gc-dyn-usage + *soft-heap-limit*))) + (*soft-heap-limit* (if soft-heap-limit-exceeded? + (+ pre-gc-dyn-usage + *bytes-consed-between-gcs*) + *soft-heap-limit*))) + (when soft-heap-limit-exceeded? + (cerror "Continue with GC." + "soft heap limit exceeded (temporary new limit=~D)" + *soft-heap-limit*)) (unless (integerp (symbol-value '*bytes-consed-between-gcs*)) ;; The noise w/ symbol-value above is to keep the compiler ;; from optimizing the test away because of the type declaim @@ -344,22 +359,29 @@ (/show0 "back from FUNCALL to *INTERNAL-GC*") (let* ((post-gc-dyn-usage (dynamic-usage)) (bytes-freed (- pre-gc-dyn-usage post-gc-dyn-usage))) + (/show0 "got (DYNAMIC-USAGE) and BYTES-FREED") (when *last-bytes-in-use* + (/show0 "doing *LAST-BYTES-IN-USE* thing") (incf *total-bytes-consed* (- pre-gc-dyn-usage *last-bytes-in-use*)) + (/show0 "setting *LAST-BYTES-IN-USE*") (setq *last-bytes-in-use* post-gc-dyn-usage)) + (/show0 "clearing *NEED-TO-COLLECT-GARBAGE*") (setf *need-to-collect-garbage* nil) + (/show0 "calculating NEW-GC-TRIGGER") (let ((new-gc-trigger (+ post-gc-dyn-usage *bytes-consed-between-gcs*))) + (/show0 "setting *GC-TRIGGER*") (setf *gc-trigger* new-gc-trigger)) + (/show0 "calling SET-AUTO-GC-TRIGGER") (set-auto-gc-trigger *gc-trigger*) (dolist (hook *after-gc-hooks*) (/show0 "doing a hook from *AFTER-GC--HOOKS*") - ;; FIXME: This hook should be called with the - ;; same kind of information as *GC-NOTIFY-AFTER*. - ;; In particular, it would be nice for the - ;; hook function to be able to adjust *GC-TRIGGER* - ;; intelligently to e.g. 108% of total memory usage. + ;; FIXME: This hook should be called with the same + ;; kind of information as *GC-NOTIFY-AFTER*. In + ;; particular, it would be nice for the hook function + ;; to be able to adjust *GC-TRIGGER* intelligently to + ;; e.g. 108% of total memory usage. (carefully-funcall hook)) (when *gc-notify-stream* (/show0 "doing the *GC-NOTIFY-AFTER* thing") @@ -377,7 +399,7 @@ (incf *gc-run-time* (- (get-internal-run-time) start-time)))) ;; FIXME: should probably return (VALUES), here and in RETURN-FROM - (/show "returning from tail of SUB-GC") + (/show0 "returning from tail of SUB-GC") nil) ;;; This routine is called by the allocation miscops to decide whether