[GHC] #14503: Killing a thread will block if there is another process reading from a handle

GHC ghc-devs at haskell.org
Wed Nov 29 12:33:48 UTC 2017


#14503: Killing a thread will block if there is another process reading from a
handle
-------------------------------------+-------------------------------------
        Reporter:  dnadales          |                Owner:  (none)
            Type:  bug               |               Status:  closed
        Priority:  normal            |            Milestone:  8.2.1
       Component:  libraries/base    |              Version:  8.0.2
      Resolution:  fixed             |             Keywords:
Operating System:  Windows           |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by dnadales):

 Reading from sockets leads to the same behavior. However, closing the
 socket before killing the thread works:

 {{{#!hs
 import qualified Data.ByteString.Char8     as C
 import           Network.Socket            hiding (recv, recvFrom, send,
 sendTo)
 import           Network.Socket.ByteString

 readWithinNSecsBinary :: IO ()
 readWithinNSecsBinary = withSocketsDo $ do
   addrinfos <- getAddrInfo Nothing (Just "") (Just "9090")
   let serveraddr = head addrinfos
   sock <- socket (addrFamily serveraddr) Stream defaultProtocol
   connect sock (addrAddress serveraddr)
   readerTid <- forkIO $ sockReader sock
   threadDelay (3 * 10^6)
   putStrLn "Killing the binary reader"
   putStrLn "Closing the socket"
   close sock -- Wihout this line the client will block
   putStrLn "Socket closed!"
   killThread readerTid
   putStrLn "Binary reader thread killed"
   where
     sockReader sock = do
       putStrLn "Receiving ..."
       msg <- recv sock 1024
       putStr "Received "
       C.putStrLn msg

 }}}

 This results in

 {{{#!text
 Receiving ...
 Killing the binary reader
 Closing the socket
 Socket closed!
 dangling-connections-exe.EXE: Network.Socket.recvBuf: failed (No error)
 Binary reader thread killed
 }}}

-- 
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/14503#comment:9>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list