[Haskell-cafe] ForeignPtrs with liveness dependencies

Einar Karttunen ekarttun at cs.helsinki.fi
Tue Jul 26 06:25:56 EDT 2005


"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, ()))

- Einar Karttunen


More information about the Haskell-Cafe mailing list