Skip to content

System.Timeout.timeout may leak <<timeout>> exceptions

The current implementation of timeout can leak Timeout exceptions if an asynchronous exception is delivered at the wrong time. The most worrysome such case is another Timeout exception raised by surrounding call to timeout. The following program reproduces the issue reliably for me:

import System.Timeout
import Control.Monad
import Control.Concurrent

t d = timeout d $ timeout d $ timeout d $ timeout d $ timeout d $ timeout (10^9) $ threadDelay 100

main = forever $ mapM_ t [1..200]

-- > ghc -O2 -rtsopts -threaded --make TT.hs
-- > ./TT +RTS -N1
-- TT: <<timeout>>

Context: A recent thread on ghc-users, starting with http://www.haskell.org/pipermail/glasgow-haskell-users/2013-February/023811.html, got me thinking about corner cases of timeout handling again.

Trac metadata
Trac field Value
Version 7.7
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component libraries/base
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information