Is this a concurrency bug in base?

Simon Marlow marlowsd at gmail.com
Fri Oct 14 16:30:42 CEST 2011


On 12/10/2011 12:24, Bertram Felgenhauer wrote:
> Jean-Marie Gaillourdet wrote:
>> This is my previous program with your workaround, it is also attached as TypeRepEqLock.hs
>>
> [snip]
>> Compile and execute:
>>
>> $ ghc-7.0.3 -threaded -rtsopts TypeRepEqLock.hs
>> <snip>
>> $ while true ; do ./TypeRepEqLock +RTS -N ; done
>> Ok
>> Ok
>> Ok
>> Ok
>> Ok
>> Ok
>> Ok
>> Ok
>> Ok
>> TypeRepEqLock: thread blocked indefinitely in an MVar operation
>> Ok
>> Ok
>> Ok
>> ^C^C
>
> 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 think it should work.  Could you make a ticket for it please?

Cheers,
	Simon




More information about the Glasgow-haskell-users mailing list