Next: Metaobject Protocol, Up: Beyond the ANSI Standard
SBCL provides additional garbage collection functionality not specified by ANSI. Weak pointers allow references to objects to be maintained without keeping them from being garbage collected, and “finalization” hooks are available to cause code to be executed when an object has been garbage collected. Additionally users can specify their own cleanup actions to be executed with garbage collection.
Arrange for the designated
function
to be called when there are no more references toobject
, including references infunction
itself.In a multithreaded environment
function
may be called in any thread. In both single and multithreaded environmentsfunction
may be called in any dynamic scope: consequences are unspecified iffunction
is not fully re-entrant.Errors from
function
are handled and cause awarning
to be signalled in whichever thread thefunction
was called in.Examples:
;;; good (assumes RELEASE-HANDLE is re-entrant) (let* ((handle (get-handle)) (object (make-object handle))) (finalize object (lambda () (release-handle handle))) object);;; bad, finalizer refers to object being finalized, causing ;;; it to be retained indefinitely (let* ((handle (get-handle)) (object (make-object handle))) (finalize object (lambda () (release-handle (object-handle object)))));;; bad, not re-entrant (defvar *rec* nil)(defun oops () (when *rec* (error "recursive OOPS")) (let ((*rec* t)) (gc))) ; or just cons enough to cause one(progn (finalize "oops" #'oops) (oops)) ; causes GC and re-entry to #'oops due to the finalizer ; -> ERROR, caught, WARNING signalled