[Haskell-cafe] How can I pass IOUArrays to FFI functions?

Donald Bruce Stewart dons at cse.unsw.edu.au
Tue Aug 21 03:19:54 EDT 2007


ryani.spam:
> 
>    > Your code is broken in a most evil and insidious way.
> 
> 
> 
>    Interesting.  This is for a toy project, so I'm not too
>    worried, but lets say I wanted to do this "correctly" and I
>    was set on using IOUArray for some reason. (The Haskell wiki
>    claims that StorableArray is slower; is that actually the
>    case?)
> 
> 
> 
>    Which of the following fixes would work now?  Which has the
>    lowest probability of not working in the future?
> 
> 
> 
>    1) Declare f to take Addr# and don't construct a Ptr Word32
> 
>        I suspect this would be enough unless the GC changed to
>    some sort of continous GC which can happen even without an
>    allocation
> 
> 
> 
>    2) Declare f to take MutableByteArray#
> 
>        Is this good enough to make the collector happy?
> 
> 
> 
>    3) Something else I haven't thought of?
> 
>    If there was no other option, and StorableArray wasn't
>    slower, and I was working on a real project, I'd probably
>    wrap my own around ForeignPtr like Data.ByteString.

Yeah, we have ForeignPtr arrays and Foreign.Array /exactly/ for calling
to C safely. I don't know why people suggest all these other dodgy
solutions, when there's one that's guaranteed by the FFI spec to work.

-- Don


More information about the Haskell-Cafe mailing list