[racket] FFI: Casting pointers

From: Michael W (mwilber at uccs.edu)
Date: Sun Jan 22 17:59:36 EST 2012

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.
> >
> 

-- 
Onward,
    _mike

Posted on the users mailing list.