[GHC] #10380: "thread blocked indefinitely" exception while blocking on a socket
GHC
ghc-devs at haskell.org
Thu May 7 00:07:32 UTC 2015
#10380: "thread blocked indefinitely" exception while blocking on a socket
-------------------------------------+-------------------------------------
Reporter: akio | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: libraries/base | Version: 7.10.1
Resolution: | Keywords:
Operating System: Linux | Architecture:
Type of failure: Incorrect result | Unknown/Multiple
at runtime | Test Case:
Blocked By: | Blocking:
Related Tickets: | Differential Revisions:
-------------------------------------+-------------------------------------
Comment (by akio):
Bryan Buecking has confirmed that the following patch fixes the issue. The
patch was taken from the base commit of D849. Strangely I can't find the
commit (635619c) in the repository.
{{{
diff --git a/libraries/base/GHC/Event/Manager.hs
b/libraries/base/GHC/Event/Manager.hs
index 11b01ad..cd039b1 100644
--- a/libraries/base/GHC/Event/Manager.hs
+++ b/libraries/base/GHC/Event/Manager.hs
@@ -456,20 +456,26 @@ onFdEvent mgr fd evs
| otherwise = do
fdds <- withMVar (callbackTableVar mgr fd) $ \tbl ->
- IT.delete (fromIntegral fd) tbl >>= maybe (return [])
selectCallbacks
+ IT.delete (fromIntegral fd) tbl >>= maybe (return [])
(selectCallbacks tbl)
forM_ fdds $ \(FdData reg _ cb) -> cb reg evs
where
-- | Here we look through the list of registrations for the fd of
interest
-- and sort out which match the events that were triggered. We re-arm
- -- the fd as appropriate and return this subset.
- selectCallbacks :: [FdData] -> IO [FdData]
- selectCallbacks fdds = do
+ -- the fd as appropriate and return a list containing the callbacks
+ -- that should be invoked.
+ selectCallbacks :: IntTable [FdData] -> [FdData] -> IO [FdData]
+ selectCallbacks tbl fdds = do
let matches :: FdData -> Bool
matches fd' = evs `I.eventIs` I.elEvent (fdEvents fd')
- (triggered, saved) = partition matches fdds
+ (triggered, notTriggered) = partition matches fdds
+ saved = notTriggered ++ filter (\fd' -> I.elLifetime
(fdEvents fd') == MultiShot) triggered
savedEls = eventsOf saved
allEls = eventsOf fdds
+ -- Reinsert multishot registrations.
+ -- We deleted the table entry for this fd above so we there isn't
a preexisting entry
+ IT.insertWith (\_ _-> saved) (fromIntegral fd) saved tbl
+
case I.elLifetime allEls of
-- we previously armed the fd for multiple shots, no need to
rearm
MultiShot | allEls == savedEls ->
}}}
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/10380#comment:3>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list