[GHC] #10545: Deadlock in the threaded RTS
GHC
ghc-devs at haskell.org
Fri Jun 19 11:05:42 UTC 2015
#10545: Deadlock in the threaded RTS
-------------------------------------+-------------------------------------
Reporter: simonmar | Owner: simonmar
Type: bug | Status: new
Priority: highest | Milestone: 7.10.2
Component: Runtime | Version: 7.10.1
System | Operating System: Unknown/Multiple
Keywords: | Type of failure: None/Unknown
Architecture: | Blocked By:
Unknown/Multiple | Related Tickets:
Test Case: |
Blocking: |
Differential Revisions: |
-------------------------------------+-------------------------------------
The following program deadlocks with high probability:
{{{
-- ghc -rtsopts -threaded -debug performGC.hs
-- ./performGC 1000 +RTS -qg -N2
-- -qg turns off parallel GC, needed to trigger the bug
-- -N2 or greater is needed
module Main (main) where
import System.Environment
import Control.Concurrent
import Control.Exception
import Control.Monad
import System.Random
import System.Mem
import qualified Data.Set as Set
main = do
[n] <- getArgs
forkIO $ doSomeWork
forM [1..read n] $ \n -> do print n; threadDelay 1000; performMinorGC
doSomeWork :: IO ()
doSomeWork = forever $ do
ns <- replicateM 10000 randomIO :: IO [Int]
ms <- replicateM 1000 randomIO
let set = Set.fromList ns
elems = filter (`Set.member` set) ms
evaluate $ sum elems
}}}
There are a few ways that this bug can be triggered:
* At shutdown, when there are other threads still running. This is how we
first encountered it.
* Using `performGC`, as above. I think it's necessary to call it from a
bound thread (e.g. the main thread) to get bad things to happen.
* I think `forkProcess` might also trigger it, but I haven't observed it.
I'm working on a fix.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/10545>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list