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@xs4all.nl> wrote:
Martin Simmons <martin@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@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@common-lisp.net
http://common-lisp.net/cgi-bin/mailman/listinfo/cffi-devel