[racket] FFI: Casting pointers

From: Jon Rafkind (rafkind at cs.utah.edu)
Date: Sun Jan 22 18:07:32 EST 2012

Actually can't you just use an input specification for the pointer?

(_ fun [vf : (_ptr i _OggVorbis_File)])

As long as you can define the OggVorbis_File struct with the ffi.

If not your solution is probably fine.

On 01/22/2012 03:59 PM, Michael W wrote:
> Wow, thanks!
>
> After a bit of reading, I arrived at this, which seems to work:
>
> (_fun ...
>       [vf : _OggVorbis_File-pointer
>           = (let ([file (malloc _OggVorbis_File 'interior)])
>                (set-cpointer-tag! file OggVorbis_File-tag)
>                file)]
>       ...)
>
> 42 minutes ago, Jon Rafkind wrote:
>> I'm pretty sure you can use cpointer-push-tag!
>>
>> http://docs.racket-lang.org/foreign/foreign_tagged-pointers.html?q=cpointer-push&q=in-lines&q=read-bytes&q=command&q=for/fold#(def._((lib._ffi/unsafe..rkt)._cpointer-push-tag!))
>>
>> (let ([file (malloc)])
>>   (cpointer-push-tag! file _OggVorbis-file-pointer
>>   file)
>>
>> On 01/22/2012 02:14 PM, Michael W wrote:
>>> Hello!
>>>
>>> In the FFI library, is there a way to cast one pointer type
>>> straight to another? I'm working with libvorbisfile (PLaneT
>>> package forthcoming) which expects me to allocate my own
>>> OggVorbis_File cstruct and pass that everywhere.
>>>
>>> I ask because (malloc _OggVorbis_File) returns a _pointer, not an
>>> _OggVorbis_File-pointer, and _fun and friends don't accept either
>>> type in place of the other.
>>>
>>> If I say:
>>>
>>>    (cast
>>>     (malloc _OggVorbis_File)
>>>     _pointer _OggVorbis_File-pointer)
>>>
>>> ...That's bad -- because I never keep the original pointer
>>> returned by the (malloc) call, the garbage collector reclaims
>>> that memory even though the _OggVorbis_File-pointer still points
>>> to it.
>>>
>>> My current workaround is to just use (malloc _OggVorbis_File)
>>> everywhere and have _pointer types in my (_fun ...) declarations.
>>> Is this the preferred way of doing it?
>>>
>>> Is there a way to ask (malloc) to return a different pointer type
>>> than _pointer?
>>>
>>> Thanks for your help.
>>>


Posted on the users mailing list.