[racket] FFI: Casting pointers
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.
>