[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.
Cheers,
Simon
More information about the Haskell-Cafe
mailing list