[Haskell-cafe] How can I pass IOUArrays to FFI functions?
Stefan O'Rear
stefanor at cox.net
Mon Aug 20 14:49:50 EDT 2007
On Mon, Aug 20, 2007 at 05:27:04AM -0700, Ryan Ingram wrote:
> I have a C function of type
> void f ( HsWord32* p0, HsWord32* p1, HsWord32 size );
>
> along with the FFI declaration:
> foreign import ccall unsafe f :: Ptr Word32 -> Ptr Word32 -> Word32 -> IO
> ()
>
> In my Haskell code I have an unboxed IO array of Word32; IOUArray Int
> Word32.
> I want to pass the pointer to this array to f(). How can I get the pointer
> out of the array? Or, is there a better way to declare f() to do this?
Short answer: You can't.
Longer: GHC uses a copying/compacting garbage collector, so most objects
don't have stable addresses. In particular MutableByteArray# is movable
by default. So, you need an array structure built on pinned memory.
If you want MArray operations, that leaves you with
Data.Array.Storable, as already mentioned.
Stefan
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
Url : http://www.haskell.org/pipermail/haskell-cafe/attachments/20070820/cc3c7c53/attachment.bin
More information about the Haskell-Cafe
mailing list