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