Re: Finalization function for GC per object in LispWorks.
"Tim Bradshaw (as tfb at tfeb dot org)" <[email protected]>
| Newsgroups | gmane.lisp.lispworks.general |
|---|---|
| Message-ID | <[email protected]> |
It's quite easy to implement a per-object finalizer model in terms of LW's:
(define-functions (finalize finalizer-table)
;; This is my define-functions hack, the aim being to avoid a
;; special-variable lookup. Unclear whether it is needed.
(let ((finalization-actions
(make-hash-table
:test #'eq
:weak-kind :key)))
(values
(lambda (o)
(funcall (gethash o finalization-actions #'identity) o))
(lambda ()
finalization-actions))))
(defun add-finalizer (thing function)
(setf (gethash thing (finalizer-table))
function)
(flag-special-free-action thing)
thing)
(defun remove-finalizer (thing)
(flag-not-special-free-action thing)
(remhash thing (finalizer-table)))
(add-special-free-action 'finalize)
Note this adds a hash lookup to anything which has a special free action. I assume that such objects are rather rare so the performance impact will not be horrible. Empirically they do seem to be.
--tim
> On 7 Nov 2025, at 15:55, Uģis Lācis (as ugis dot lacis at equa dot se) <[email protected]> wrote:
>
> Dear LW users and developers,
> Continuing my work on our old codebase originally ran in AllegroCL 3.0, I have stumbled upon the following problem. Apparently, ACL (and also SBCL, if I understand correctly) allows defining special clean-up functions for objects:
> ACL: (add-finalization my-stream #'close)
> SBCL: (sb-ext:finalize object (lambda () (release-handle handle))) SBCL 2.5.10 User Manual
>
> Looking for analogous option in LispWorks, closest thing I have found is (hcl:add-special-free-action), however it is global and requires tagging the objects for special clean-up.
> I this the only option we have in LispWorks, or is there something that is closer to ACL/SBCL that I have not managed find?
> Best wishes,
> Ugis
_______________________________________________
Lisp Hug - the mailing list for LispWorks users
[email protected]
http://www.lispworks.com/support/lisp-hug.html