[GHC] #14503: Killing a thread will block if there is another process reading from a handle
GHC
ghc-devs at haskell.org
Tue Nov 21 17:29:44 UTC 2017
#14503: Killing a thread will block if there is another process reading from a
handle
----------------------------------------+---------------------------------
Reporter: dnadales | Owner: (none)
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 8.0.2
Keywords: | Operating System: Windows
Architecture: Unknown/Multiple | Type of failure: None/Unknown
Test Case: | Blocked By:
Blocking: | Related Tickets:
Differential Rev(s): | Wiki Page:
----------------------------------------+---------------------------------
When trying to kill a thread, the program (which uses a thread) hangs if
there is another process trying to read from a handle. This bug can be
reproduced with using
[https://github.com/capitanbatata/sandbox/tree/master/dangling-connections
this sample code]. I'll explain the relevant details below.
I have the following Haskell code:
{{{#!hs
someFuncWithChans :: IO ()
someFuncWithChans = withSocketsDo $ do
h <- connectTo "localhost" (PortNumber 9090)
hSetBuffering h NoBuffering
ch <- newChan
putStrLn "Starting the handler reader"
readerTid <- forkIO $ handleReader h ch
cmdsHandler h ch
putStrLn "Killing the handler reader"
killThread readerTid
putStrLn "Closing the handle"
hClose h
cmdsHandler :: Handle -> Chan Action -> IO ()
cmdsHandler h ch = do
act <- readChan ch
case act of
Quit -> putStrLn "Bye bye"
Line line -> do
hPutStrLn h (reverse line)
cmdsHandler h ch
handleReader :: Handle -> Chan Action -> IO ()
handleReader h ch = forever $ do
line <- strip <$> hGetLine h
case line of
"quit" -> writeChan ch Quit
_ -> writeChan ch (Line line)
data Action = Quit | Line String
}}}
Is the function `someFuncWithChans` is run along with the following Java
program, then the former will block while killing the handler reader
(`readerTid`).
{{{#!java
public static void main(String[] args) throws IOException,
InterruptedException {
ServerSocket serverSock = new ServerSocket(9090);
Socket sock = serverSock.accept();
InputStream inStream = sock.getInputStream();
BufferedReader sockIn = new BufferedReader(new
InputStreamReader(inStream));
OutputStream outStream = sock.getOutputStream();
PrintWriter sockOut = new PrintWriter(new
OutputStreamWriter(outStream));
while (true) {
Thread.sleep(1000);
System.out.println("Sending foo");
sockOut.println("foo");
sockOut.flush();
String s = sockIn.readLine();
System.out.println("Got " + s );
Thread.sleep(1000);
System.out.println("Sending bar");
sockOut.println("bar");
sockOut.flush();
s = sockIn.readLine();
System.out.println("Got " + s );
Thread.sleep(1000);
System.out.println("Sending quit");
sockOut.println("quit");
sockOut.flush();
// This will cause someFuncWithChans to block when killing the
// reader thread.
s = sockIn.readLine();
System.out.println("Got " + s );
}
}
}}}
If the `sockIn.readLine()` is commented out, then killing the thread will
succeed. This problem appears only on my Windows machine (at work),
whereas it does not on my personal Linux machine.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/14503>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list