Running a "final" finaliser
Adrian Hey
ahey at iee.org
Tue Dec 23 15:44:31 EST 2003
Hello
On Tuesday 23 Dec 2003 9:27 am, Simon Marlow wrote:
> > Assuming the weak pointers solution is the way to go, I've been
> > re-aquainting myself with System.Mem.Weak and now I'm now wondering
> > what is an appropriate key for each ForeignPtr.
>
> Before we go down that route, I want to be sure that it's actually
> necessary to use weak pointers. It sounds like your application has the
> following properties:
>
> - there is a library that can allocate some resources, where
> each resource is represented by a ForeignPtr
Basically, but there are also some hardware resources (other than memory)
which are claimed just as a result of library initialisation (before any
library objects have been created).
> - a resource needs to be released when it is no longer referenced
Yes, that's right.
> - at some point, we would like to free *all* outstanding resources
> (either at the end of the program, or when the library is no
> longer required).
I want to free all heap space used by library objects, then free whatever
other hardware resources have been claimed by the library (by calling
the appropriate shutdown routine).
> If this is the case, I'd do it something like this:
>
> - keep a global list of the pointers still to be released, probably
> a doubly-linked list. Lock the whole thing with an MVar. Elements
> are Ptrs, not ForeignPtrs.
>
> - the finaliser on each ForeignPtr removes the corresponding Ptr from
> the list.
>
> - the final cleanup routine explicitly releases all the remaining
> Ptrs in the list, holding the MVar lock as it does so to avoid
> race conditions with finalisers.
>
> Weak pointers aren't required, AFAICT.
Maybe, I'd forgotten that I could get at the Ptr inside each ForeignPtr.
I guess I've still got to think about the consequences of ForeignPtr
finalisers being run after the "final" shutdown. (Making each
List cell an IORef (Maybe something) would do that I think).
The other complication I can see is that ForeignPtr finalisers can't
be Haskell. So I have to call the Haskell finalisation from C.
Is that safe? I'm afraid I still don't fully understand why Haskell
finalisers are unsafe or why (if) calling Haskell from a C finaliser
(which then called C land again) would be any safer.
Thanks for the idea though. I'll play about with a few implementations
of these ideas after christmas and see what problems I encounter.
Regards
--
Adrian Hey
More information about the Glasgow-haskell-users
mailing list