[GHC] #12019: Profiling option -hb is not thread safe
GHC
ghc-devs at haskell.org
Fri May 6 04:55:28 UTC 2016
#12019: Profiling option -hb is not thread safe
-------------------------------------+-------------------------------------
Reporter: erikd | Owner: erikd
Type: bug | Status: new
Priority: normal | Milestone: 8.0.2
Component: Runtime | Version: 8.1
System |
Keywords: | Operating System: Unknown/Multiple
Architecture: | Type of failure: Runtime crash
Unknown/Multiple |
Test Case: | Blocked By:
Blocking: | Related Tickets: #11978, #12009
Differential Rev(s): | Wiki Page:
-------------------------------------+-------------------------------------
This ticket is a continuation of #11978 and #12009. After fixing a couple
of issues in those two tickets I found that the profiling run time is not
thread safe.
Have a trivial test program (written as one of the tests for #11978):
{{{
import Control.Concurrent
import Control.Concurrent.MVar
import Control.Exception
import Control.Monad
main :: IO ()
main = do
putStrLn "Start ..."
mvar <- newMVar (0 :: Int)
let count = 50
forM_ [ 1 .. count ] $ const $ forkIO $ do
threadDelay 100
i <- takeMVar mvar
putMVar mvar $! i + 1
threadDelay 1000000
end <- takeMVar mvar
putStrLn $ "Final result " ++ show end
assert (end == count) $ return ()
}}}
Compiling that with a compiler that has bug fixes arising from #11978 and
#12009 as:
{{{
inplace/bin/ghc-stage2 testsuite/tests/profiling/should_run/T11978b.hs \
-fforce-recomp -rtsopts -fno-warn-tabs -O -prof -static -auto-all \
-threaded -debug -o T11978b
}}}
and run as:
{{{
./T11978b +RTS -p -hb -N10
}}}
crashes in a number of different ways. I've seen at least 3 different
assertion failures and numerous segfaults (in different `stg_ap_*`
functions).
Replace `-hb` with other profiling options like `-hr` etc do not seem to
crash.
Looking at code, one example of lack of thread safetly is the function
`LDV_recordDead` which mutates global variable `censuses` which does not
have any locking around it. Only figured this out because the following
assert (in `LDV_recordDead`) was being triggered occasionally.
{{{
ASSERT(censuses[t].void_total < censuses[t].not_used);
}}}
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/12019>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list