jgoerzen/hslogger — pull request #8 by errge (2012-07-03 14:54:15+00:00)
Title: fixed catching of SomeException in streamHandler

Hi,

Test code:
-=-
import Control.Concurrent
import Control.Monad
import System.Log.Logger

main = do
updateGlobalLogger rootLoggerName (setLevel DEBUG)
mainThread <- myThreadId
_ <- forkIO $ forever $ do
killThread mainThread
threadDelay 1
forever $ logM "" INFO "foobar"
-=-

Running this after compilation like this:

ghc --make test && ./test 2>&1 | uniq -c

shows that killing a thread that is in a logging function right now is not stable:

1 Error writing log message: thread killed (original message: foobar)
1116 foobar
1 fooError writing log message: thread killed (original message: foobar)
2569 foobar
1 Error writing log message: thread killed (original message: foobar)
1717 foobar
1 fError writing log message: thread killed (original message: foobar)
3515 foobar
1 foobarError writing log message: thread killed (original message: foobar)
3438 foobar
1 foError writing log message: thread killed (original message: foobar)
3400 foobar
1 test: thread killed

This is because streamHandler catches all the exceptions, even async ones. This is totally discouraged and results in errors like this.

After my patch:

$ ghc -fforce-recomp --make test && ./test 2>&1 | uniq -c
[1 of 1] Compiling Main ( test.hs, test.o )
Linking test ...
1 test: thread killed

Please consider including this patch, thanks!

Further info: http://hackage.haskell.org/packages/archive/base/latest/doc/html/Control-Exception.html#g:4