On 13/08/2010 09:53, Simon Marlow wrote:
On 12/08/2010 21:59, Yitzchak Gale wrote:
Wei Hu wrote:
nonTermination _ = blackhole where blackhole = blackhole

My original example was actually:

process :: String -> String
process = let x = x in x

Ah yes, that works too. But other similar versions don't, like this one:

process :: String -> String
process _ = let x = x in x

Hence why I added the "tail" in my version.

So what happens is this:

- the recursive definition causes the main thread to block on itself
(known as a "black hole")

- the program is deadlocked (no threads to run), so the runtime
invokes the GC to see if any threads are unreachable

- the GC finds that
(a) the main thread is unreachable and blocked on a blackhole, so it
gets a NonTermination exception
(b) the Handle is unreachable, so its finalizer is started

- the finalizer runs first, and closes the Handle

- the main thread runs next, and the exception handler for writeFile
tries to close the Handle, which has already been finalized

Really hClose shouldn't complain about a finalized handle, I'll see if I
can fix that.

One other thing: this has nothing to do with lazy IO, the readFile is a red herring, you can get the same result without it.

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

Reply via email to