[Haskell-cafe] ForeignPtrs with liveness dependencies

Simon Marlow simonmar at microsoft.com
Tue Jul 26 06:30:42 EDT 2005

On 26 July 2005 11:26, Einar Karttunen wrote:

> "Simon Marlow" <simonmar at microsoft.com> writes:
>> You might be able to find more information on this in the mailing
>> list archives.  It's true that touchForeignPtr isn't enough to
>> enforce an ordering on the running of finalizers, but it *can* be
>> used to express a liveness relationship between one ForeignPtr and
>> another (ForeignPtr A is alive if ForeignPtr B is alive).  This
>> should be enough if you're dealing with pointer relationships
>> between memory objects, for example, where it doesn't matter which
>> one gets freed first when they're both unreferenced.
> The order of the cleanup functions is significant in this case,
> so that does not unfortunately help.
>> If you really do need ordering, maybe it would be possible to use
>> reference counting in your case?
> I ended up using the following design, which seems to work fine:
> data Foo = Foo (ForeignPtr Foo) (IORef [IO ()])
> Each ForeignPtr Foo has a single finalizer which first calls the
> C-side cleanup function for Foo and then executes all the IO-actions
> inside the IORef.
> Now the association becomes
> associate (Foo _ ref) bar =
>   atomicModifyIORef ref (\lst -> (touchForeignPtr bar : lst, ()))

Isn't that equivalent to using addForeignPtrFinalizer?  I don't think
this fixes anything: the finalizer for bar can still run before the
finalizer for foo.


More information about the Haskell-Cafe mailing list