[Haskell-cafe] FFI and modifying haskell memory
Sven Panne
Sven.Panne at aedion.de
Sat Oct 22 09:04:26 EDT 2005
Am Samstag, 22. Oktober 2005 01:42 schrieb John Meacham:
> On Fri, Oct 21, 2005 at 03:19:36PM +0100, Joel Reymont wrote:
> > Is there a particular reason why StablePtr cannot provide a "fixed"
> > memory address? Then 4 bytes of memory won't need to be allocated so
> > that C could write to them and C could just modify the Haskell variable.
>
> because haskell values don't have the same representation as C values.
> haskell values are pointers to updatable thunks. in any case 'with'
> just allocates 4 bytes on the stack (the same as a auto C declaration)
> so is quite speedy compared to what it would take to make a haskell
> value look like a C one. not to mention haskell values can't be
> modified.
2 tiny remarks:
* In Simon's example the first parameter to 'with' (the initial buffer size)
was missing, but I guess you've figured this out already. In general: If the
pointer you're passing to C has "in" semantics, 'with' (or one of its
variations) is your friend. For "in/out" semantics, use 'with' + 'peek', and
for "out" semantics" use 'alloca' + 'peek'.
* As already mentioned, StablePtr can even refer to something which has no
direct C counterpart, like Haskell functions. Needing them in the C world
seems strange at first, because there is nothing thrilling you can do with
them but pass them back to Haskell. But there are actually some good uses for
that, like interfacing to callback-based C APIs where some additional
bookkeeping is needed.
Cheers,
S.
More information about the Haskell-Cafe
mailing list