ANN: H98 FFI Addendum 1.0, Release Candidate 7

Simon Marlow simonmar at microsoft.com
Thu Sep 19 10:17:02 EDT 2002


> > > RC 7 of the FFI Addendum is now available from
> > 
> > In adding mallocForeignPtr and friends to Hugs, I found 
> that I needed
> > the address of free to pass as a parameter.
> > 
> > There's no suitable way to generate &free from 
> MarshalAlloc.free (the
> > obvious use of a Haskell wrapper would break the whole 
> reason for the
> > recent change to ForeignPtrs).
> > 
> > Could we add &free to the export list of MarshalAlloc?
> > 
> >   foreign import ccall unsafe "stdlib.h &free" ptr_free :: 
> FunPtr (Ptr a -> IO ())
> > 
> > I am currently using 'ptr_free' as the Haskell name for this pointer
> > but I expect that a better name could be found with little effort.
> 
> So far, we never explicitly say (I believe) that `malloc'
> corresponds to C's `malloc()'; ie, that C's `free()' (and
> hence, `ptr_free') may actually be used to free storage that
> has been allocated by `malloc'.
> 
> We might define the CAF
> 
>   cfree :: FunPtr (Ptr a -> IO ())
> 
> as a pointer to a C function that free's storage allocated
> with `malloc' from C without entering Haskell land and
> explicitly note that this is useful as a finalizer.
> 
> The construction still seems pretty awkward to me.  I hope
> the change to ForeignPtr doesn't entail any more nasty
> suprises like this.

... maybe I'm being stupid, but I don't see what the problem is.  Why
can't mallocForeignPtr be implemented as:

  mallocForeignPtrBytes size = do
    r <- c_malloc (fromIntegral size)
    newForeignPtr r ptr_c_free

  foreign import ccall unsafe "malloc"
    c_malloc :: CInt -> Ptr a
  foreign import ccall unsafe "&free" 
    ptr_c_free :: ForeignPtr (Ptr a -> IO ())

i.e. it's completely independent of MarshalAlloc.malloc.  If you happen
to know that MarshalAlloc.malloc is the same as C's malloc, then you
could use that instead, but you don't have to.

A separate issue is whether MarshalAlloc.malloc *should* be specified as
being an interface to C's malloc().  I hadn't noticed that it currently
wasn't.  I don't think I have any code that relies on it, and I can't
think of any strong arguments one way or the other, apart from the fact
that MarshalAlloc is not part of the C-specific marshalling library.

Cheers,
	Simon



More information about the FFI mailing list