[Haskell-cafe] Re: A GHC error message puzzle

Simon Marlow marlowsd at gmail.com
Fri Aug 13 05:46:56 EDT 2010


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


More information about the Haskell-Cafe mailing list