;; See comment in interr.lisp
*heap-exhausted-error-condition* (make-condition 'heap-exhausted-error)))
-(declaim (ftype (function () unsigned-byte) get-bytes-consed))
+(declaim (ftype (sfunction () unsigned-byte) get-bytes-consed))
(defun get-bytes-consed ()
#!+sb-doc
"Return the number of bytes consed since the program began. Typically
;;; For GENCGC all generations < GEN will be GC'ed.
-(defvar *already-in-gc*
- (sb!thread:make-mutex :name "GC lock") "ID of thread running SUB-GC")
+(defvar *already-in-gc* (sb!thread:make-mutex :name "GC lock"))
;;; A unique GC id. This is supplied for code that needs to detect
;;; whether a GC has happened since some earlier point in time. For
(defvar *gc-epoch* (cons nil nil))
(defun sub-gc (&key (gen 0))
- (unless (eq sb!thread:*current-thread*
- (sb!thread:mutex-value *already-in-gc*))
+ (unless (sb!thread:holding-mutex-p *already-in-gc*)
;; With gencgc, unless *GC-PENDING* every allocation in this
;; function triggers another gc, potentially exceeding maximum
;; interrupt nesting. If *GC-INHIBIT* is not true, however,
;; for finalizers and after-gc hooks.
(when (sb!thread:thread-alive-p sb!thread:*current-thread*)
(run-pending-finalizers)
- (dolist (hook *after-gc-hooks*)
- (handler-case
- (funcall hook)
- (serious-condition (c)
- (warn "Error calling after-GC hook ~S:~% ~A" hook c)))))))))
+ (call-hooks "after-GC" *after-gc-hooks* :on-error :warn))))))
;;; This is the user-advertised garbage collection function.
(defun gc (&key (gen 0) (full nil) &allow-other-keys)