Finalizers finalized
Manuel M T Chakravarty
chak at cse.unsw.edu.au
Wed Jan 22 00:43:38 EST 2003
Ross Paterson <ross at soi.city.ac.uk> wrote,
> On Fri, Jan 17, 2003 at 10:23:27AM +1100, Manuel M T Chakravarty wrote:
> > Ross Paterson <ross at soi.city.ac.uk> wrote,
> >
> > > I'd also like to see the addition of
> > >
> > > mallocForeignPtrArray :: Storable a => Int -> IO (ForeignPtr a)
> > >
> > > to ForeignPtr, to save people from rolling their own. (Maybe the realloc
> > > and 0 versions too?)
> >
> > The reason I didn't answer to this earlier is that I wanted
> > to see how many people say that they support this addition.
> > To be honest, I never needed a function like this. Did
> > anybody else?
>
> Only me, it seems. But surely if both mallocForeignPtr and mallocArray
> are useful, this is too.
>
> If you don't want to do explicit deallocation, mallocForeignPtr is
> attractive (and handled specially by GHC). Sooner or later there are
> going to be arrays, and then if there's no such function you'll have to
> write your own.
Yes, I think you are right that an orthogonality argument
can be made here. So, let's add the function. I assume
from the silence on this topic that nobody has an serious
objections to adding this function.
`mallocForeignPtrArray0' should then also be added, as you
say.
I am not so sure about a realloc version. It, at least,
requires some care, as realloc may return a pointer different
from the original. (In other words, there is no guarantee
that realloc works in-place.) I just noticed that the spec
doesn't mention this; so, I'll add it. We should also
include the special cases that the C library covers:
* If `realloc' is passed a `nullPtr', it works like
`malloc'.
* If the size requested from `reallocBytes' is 0, it works
like `free'.
Finally, I am not sure whether we really want to allow that
`reallocBytes' may be used on `alloca'ed memory, which the
spec currently explicitly admits.
Proposed changes
~~~~~~~~~~~~~~~~
Add to `ForeignPtr':
mallocForeignPtrArray :: Storable a => Int -> IO (ForeignPtr a)
mallocForeignPtrArray0 :: Storable a => Int -> IO (ForeignPtr a)
Refine spec of `MarshalAlloc' as follows:
* realloc may return a pointer other than the one passed in.
State special cases for passing `nullPtr' and size of 0,
respectively, to `realloc' as stated above.
[I will already apply these changes.]
Open questions (feedback requested)
~~~~~~~~~~~~~~
* Shall we remove the sentence allowing `reallocBytes' on
`alloca'ed memory?
* Shall we provide reallocForeignPtrArray and
reallocForeignPtrArray0?
[I will not apply these changes until after further
discussion.]
Cheers,
Manuel
More information about the FFI
mailing list