From f088c2d42aaa38b32482ea8c4324786123835e62 Mon Sep 17 00:00:00 2001 From: Zejun Wu Date: Thu, 22 Nov 2018 11:49:51 -0500 Subject: Fix deadlock bug when mkFastStringWith is duplicated In D5211, we use `withMVar` to guard writes to the same segment, this is unsafe to be duplicated. It can lead to deadlock if it is only run partially and `putMVar` is not called after `takeMVar`. Test Plan: ./validate We used to see deadlock when building stackage without this fix, and it no longer happens. Reviewers: simonmar, bgamari Reviewed By: simonmar Subscribers: rwbarton, carter Differential Revision: https://phabricator.haskell.org/D5349 --- compiler/utils/FastString.hs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'compiler/utils/FastString.hs') diff --git a/compiler/utils/FastString.hs b/compiler/utils/FastString.hs index c53eff1dd1..f9fbeb0e6e 100644 --- a/compiler/utils/FastString.hs +++ b/compiler/utils/FastString.hs @@ -114,14 +114,13 @@ import qualified Data.ByteString.Unsafe as BS import Foreign.C import GHC.Exts import System.IO -import System.IO.Unsafe ( unsafePerformIO ) import Data.Data import Data.IORef import Data.Maybe ( isJust ) import Data.Char import Data.Semigroup as Semi -import GHC.IO ( IO(..), unIO, unsafeDupablePerformIO ) +import GHC.IO import Foreign @@ -400,6 +399,9 @@ mkFastStringWith mk_fs !ptr !len = do case res of Just found -> return found Nothing -> do + -- The withMVar below is not dupable. It can lead to deadlock if it is + -- only run partially and putMVar is not called after takeMVar. + noDuplicate n <- get_uid new_fs <- mk_fs n withMVar lock $ \_ -> insert new_fs -- cgit v1.2.1