On Sun, 08 May 2011 14:39:41 +0200, Nitralime said:
Using a finalizer seems to be a possible way to go. But I'm not sure how
this can be done by just using the finalizer parameters "object" and
"function"
where "function" can't reliablely access "object" (cf. documentation of
finalizer
in "trivial-garbage" package)!!
Any help and feedback is very much appreciated!
IMHO, attempting to transparently wrap a foreign object with a CLOS object is
not a good design.
Using a finalizer is dangerous because it is difficult to guarantee that the
Lisp wrapper object is retained for the correct lifetime.
For example, consider
(defstruct table
foreign-pointer)
(defun allocate-table ()
(make-table :foreign-pointer (foreign-allocate-table)))
(defun allocate-and-munge-table ()
(let ((table (allocate-table)))
(foreign-munge-table (table-foreign-pointer table))))
The compiler might not keep the variable "table" alive during the call to the
foreign function foreign-munge-table. As a result, the Lisp table object
might be gc'ed in another thread while the foreign code is accessing it.