[GHC] #14530: hWaitForInput causes the program to abort on Windows

GHC ghc-devs at haskell.org
Wed Dec 27 10:46:10 UTC 2017


#14530: hWaitForInput causes the program to abort on Windows
-----------------------------------+--------------------------------------
        Reporter:  dnadales        |                Owner:  (none)
            Type:  bug             |               Status:  new
        Priority:  normal          |            Milestone:
       Component:  Core Libraries  |              Version:  8.0.2
      Resolution:                  |             Keywords:
Operating System:  Windows         |         Architecture:  x86_64 (amd64)
 Type of failure:  Runtime crash   |            Test Case:
      Blocked By:                  |             Blocking:
 Related Tickets:                  |  Differential Rev(s):
       Wiki Page:                  |
-----------------------------------+--------------------------------------
Description changed by dnadales:

Old description:

> When running the following program on Windows (10):
>
> {{{#!hs
> readWithinNSecs :: IO ()
> readWithinNSecs = withSocketsDo $ do
>   h <- connectTo "localhost" (PortNumber 9090)
>   hSetBuffering h NoBuffering
>   readerTid <- forkIO $ politeReader h
>   threadDelay (2 * 10^6)
>   killThread readerTid
>
>   where
>     politeReader h = do
>       info <- hShow h
>       putStrLn info
>       line <- ifM (hWaitForInput h (10^6)) (hGetLine h) (return
> "Nothing!")
>       putStrLn $ "Got " ++ line
> }}}
>
> The program aborts with the following error:
>
> {{{#!text
> {loc=<socket: 380>,type=duplex (read-write),buffering=none}
> fdReady: fd is too big
> This application has requested the Runtime to terminate it in an unusual
> way.
> }}}

New description:

 When running the "server" and "client" progams shown below, the client
 aborts, on Windows (10), with the following error:

 {{{#!text
 {loc=<socket: 380>,type=duplex (read-write),buffering=none}
 fdReady: fd is too big
 This application has requested the Runtime to terminate it in an unusual
 way.
 }}}

 Here is the code for the client:

 {{{#!hs

 import Network
 import Control.Concurrent
 import System.IO

 main = readWithinNSecs

 readWithinNSecs :: IO ()
 readWithinNSecs = withSocketsDo $ do
   h <- connectTo "localhost" (PortNumber 9090)
   hSetBuffering h NoBuffering
   readerTid <- forkIO $ politeReader h
   threadDelay (2 * 10^6)
   killThread readerTid

   where
     politeReader h = do
       info <- hShow h
       putStrLn info
       gotSth <- hWaitForInput h (10^6)
       if gotSth
         then do
             line <- hGetLine h
             putStrLn $ "Got " ++ line
         else
             return ()

 }}}

 And here the code for the server:

 {{{#!hs

 module Main where

 import Network.Socket
 import Control.Concurrent

 main :: IO ()
 main = do
     sock <- socket AF_INET Stream 0    -- create socket
     setSocketOption sock ReuseAddr 1   -- make socket immediately reusable
 - eases debugging.
     bind sock (SockAddrInet 9090 iNADDR_ANY)   -- listen on TCP port 4242.
     listen sock 2                              -- set a max of 2 queued
 connections
     mainLoop sock

 mainLoop :: Socket -> IO ()
 mainLoop sock = do
     conn <- accept sock     -- accept a connection and handle it
     runConn conn            -- run our server's logic
     mainLoop sock           -- repeat

 runConn :: (Socket, SockAddr) -> IO ()
 runConn (sock, _) = do
     threadDelay (2 * 10^6)
     send sock "Hello!\n"
     close sock

 }}}

--

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


More information about the ghc-tickets mailing list