[racket-dev] foreign struct access different in 5.1.3?

From: Kevin Tew (tewk at cs.utah.edu)
Date: Sat Sep 17 09:44:50 EDT 2011

On 09/16/2011 09:04 PM, John Clements wrote:
> On Sep 16, 2011, at 3:06 PM, John Clements wrote:
>
>> I'm trying to backport working FFI code to 5.1.3, and I'm having trouble referring to elements of a C struct. Specifically, in the presence of this definition
>>
>> (define-cstruct _rack-audio-closure
>>   ([sound         _pointer]
>>    [cur-sample    _ulong]
>>    [num-samples   _ulong]
>>    [stop-now      _bool]
>>    [stop-sema-ptr _pointer]))
>>
>> using the function (rack-audio-closure-cur-sample) on the result of an FFI call with signature
>>
>> (_fun _pointer _ulong _pointer ->  _rack-audio-closure-pointer)
>>
>> produces this error:
>>
>> rack-audio-closure-cur-sample: expected argument of type<struct:rack-audio-closure>; given #<cpointer:rack-audio-closure>
>>
>> in 5.1.3, but it works just fine in the git head.
> More research suggests that the problem is more limited; it looks like a problem of generativity. That is, if I have two modules that declare the "same" cstruct (same name, same fields, same types) then cpointers to these structures returned by functions from the first module cannot be accessed in the other module.

in 5.1.3 "same" cstructs defined in two different modules could not 
inter-operate.
Each place has it own copy of modules, so
the "same" cstruct defined in the same module but in two different 
places wouldn't inter-operate either.
Hence the change.


AFAICT, This is not the case in more recent versions; that is, these cstructs are not generative.  Assuming this is deliberate, I could document it.

This is deliberate.  It allows foreign pointers to be shared between places.

The following text was removed from the documentation in the head 
version because cstructs are not generative anymore.

Note that tags are compared with @racket[eq?] (or @racket[memq]), which 
means
an interface can hide its value from users (e.g., not provide the
@racket[cpointer-tag] accessor), which makes such pointers un-fake-able.

If you would like document the fact that cstructs are generative only up 
to version 5.1.3.  I think that improve the docs.
Thanks,

Kevin
>
> John
>
>
>
> _________________________________________________
>    For list-related administrative tasks:
>    http://lists.racket-lang.org/listinfo/dev

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/dev/archive/attachments/20110917/fbdc26b2/attachment.html>

Posted on the dev mailing list.