"Simon Marlow" <[EMAIL PROTECTED]> 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
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to