[racket] FFI: Casting pointers

From: Jon Rafkind (rafkind at cs.utah.edu)
Date: Sun Jan 22 17:13:24 EST 2012

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.