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.