John Meacham wrote:
Yeah. this is a major bug in ghc IMHO. I believe it has been fixed, but
am unsure.

It hasn't been fixed, this is the current behaviour and it's likely to stay that way, I'm afraid.

We used to run finalizers on exit, but we stopped doing that for various reasons. Even when we did run finalizers on exit, we couldn't guarantee to run all of them.

Since we can't rely on finalizers to run in general, some
sort of 'atexit' routine is needed. (which would be a good addition to
the standard libraries anyway)

You can implement atexit quite straightforwardly, if that's what you want.

exits = unsafePerformIO (newIORef []) :: IORef [IO ()]
main = do_stuff `finally` (readIORef exits >>= sequence_ . reverse)
atexit io = modifyIORef exits (io:)

In reality you probably want to use weak pointers here. Using this version of atexit to close Handles is bad, because it holds on to the Handle until the end of the program. Better to use a Weak pointer and allow the Handle to be GC'd, but then you still need finalizers.

Cheers,
        Simon

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to