
Hi Bertram, On 12.10.2011, at 13:24, Bertram Felgenhauer wrote:
This has nothing to do with Data.Typeable though - it appears to be some interaction between unsaferPerformIO and MVars that I do not understand. The following program occasionally terminates with "thread blocked indefinitely in an MVar operation", too (tested on ghc 7.0.3 and 7.2.1):
import Control.Concurrent import Control.Exception import Control.Monad import System.IO.Unsafe
main :: IO () main = do -- evaluate lock -- adding this line fixes the problem
fin1 <- newEmptyMVar fin2 <- newEmptyMVar
forkIO $ ping >>= putMVar fin1 forkIO $ ping >>= putMVar fin2
takeMVar fin1 takeMVar fin2
{-# NOINLINE lock #-} lock :: MVar () lock = unsafePerformIO $ newMVar ()
ping = do () <- takeMVar lock putMVar lock ()
Since I don't yet understand why this blocks, I cannot say whether it should work or not.
I've seen blocks with GHC 6.12.1, but I never got one with 7.0.3 and 7.2.1. Probably, bad luck on my side. ;-) Cheers, Jean