# Proposed change to ForeignPtr

Manuel M T Chakravarty chak at cse.unsw.edu.au
Tue Sep 10 03:28:52 EDT 2002

Manuel M T Chakravarty <chak at cse.unsw.edu.au> wrote,

> We seem to have a consensus on this one.  We change the type
> of the existing functions to
>
>   newForeignPtr :: Ptr a -> FunPtr (Ptr a -> IO ()) -> IO (ForeignPtr a)
>   addForeignPtrFinalizer :: ForeignPtr a -> FunPtr (Ptr a -> IO ()) -> IO ()
>
> For GHC, I propose to put the closure-based versions into an
> extra module (that's easy enough with the hierarchical
> libraries).  This makes changing over old code easier, as it
> merely requires to alter the import and not all occurences
> of the functions.
>
> Any objections?

I have changed this in the spec now.  I attach the wording
used in the spec.

Manuel

-=-

\item[newForeignPtr ::\ Ptr a -> FunPtr (Ptr a -> IO ()) -> IO (ForeignPtr a)]
Turn a plain memory reference into a foreign object by associating a
finalizer with the reference.  The finalizer is represented by a pointer to
an external function, which will be executed after the last reference to the
foreign object is dropped.  On invocation, the finalizer receives a pointer
to the associated foreign object as an argument.  Note that there is no
guarantee on how soon the finalizer is executed after the last reference was
dropped; this depends on the details of the Haskell storage manager. The
only guarantee is that the finalizer runs before the program terminates.

Whether a finaliser may call back into the Haskell system is system
dependent.  Portable code may not rely on such call backs.

\item[addForeignPtrFinalizer ::\ ForeignPtr a -> FunPtr (Ptr a -> IO ()) -> IO
()] Add another finalizer to the given foreign object. No guarantees are
made on the order in which multiple finalizers for a single object are run.