[Cffi-devel] Fw: Fw: Fw: Help perfecting my GC finalizer/constructor

Joeish W joeish80829 at yahoo.com
Tue Apr 29 05:42:58 UTC 2014


I noticed a parentheses was missing is this right



(defmethod translate-to-foreign ((lisp-value cv-matrix) (c-type cv-mat))
    (values  (c-pointer lisp-value) lisp-value))





On Monday, April 28, 2014 10:20 PM, Willem Rein Oudshoorn <woudshoo at xs4all.nl> wrote:
 
Martin Simmons <martin at lispworks.com> writes:
>
>>>>>>> On Mon, 28 Apr 2014 07:26:07 +0200, Willem Rein Oudshoorn said:
>>> Cancel-Lock: sha1:zqpk08tO/PaCrz3PLTlI+ocAF9E=
>>> 
>>> Joeish W <joeish80829 at yahoo.com> writes:
>>> 
>>> > How do I work with the metaobjects(is that what they are called)
>>> > output by the code you gave me...If you can show me how to mem-aref
>>> > one I would really appreciate it
>>> 
>>> Sorry for the short answer, but at the moment I am extremely busy.
>>> If you followed the example
>>> 
>>>  (mem-aref (c-pointer YOUR-POINT) ...)
>>> 
>>> should work.
>>
>> It might be interesting (or scary depending on your point of view) to consider
>> what happens if the variable YOUR-POINT is the last reference to the CLOS
>> object here...the finalizer might free the foreign object before mem-aref is
>> entered if the compiler no longer keeps a pointer to the variable.
>>
>No this is not safe.  In general you should never do 
>`(c-pointer ...)` outside the low level parts of the bindings, and use
>it very carefully.
>
>Personally I would try to never use the `c-pointer` method outside
>the `translate-to-foreign` code.   And I naively expected that this
>would be safe.   But as you point out:
>
>> Or more specifically, can this ever be safe?
>>
>> (mem-aref (c-pointer (point0)) ...)
>
>This is never safe.
>
>I think the easiest fix is to change the 
>
>  (defmethod translate-to-foreign ((lisp-value cv-matrix) (c-type cv-mat))
>    (c-pointer lisp-value))
>
>code to  [UNTESTED CODE]:
>
>
>  (defmethod translate-to-foreign ((lisp-value cv-matrix) (c-type cv-mat))
>    (values  (c-pointer lisp-value) lisp-value)
>
>
>This should keep the lisp-value around until we are done using the
>`(c-pointer ...)` value.   Provided of course you are not mucking around
>with the `c-pointer` method yourself.
>
>
>In general, I would advocate to hide all the nasty c-pointer business in
>the translate methods and never deal with it outside that limited scope.
>
>
>Thank you for bringing this to my attention.  I do think we need a paper
>or section in the manual on how to deal with combing GC in Lisp and
>manual memory management on the C side.  
>
>When my time frees up (hopefully in a month or two)  I might take a stab 
>at a first draft.
>
>Kind regards,
>Wim Oudshoorn.
>
>
>_______________________________________________
>Cffi-devel mailing list
>Cffi-devel at common-lisp.net
>http://common-lisp.net/cgi-bin/mailman/listinfo/cffi-devel
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.common-lisp.net/pipermail/cffi-devel/attachments/20140428/598e50f0/attachment.html>


More information about the cffi-devel mailing list