#4934: threadWaitRead works incorrectly on nonthreaded RTS
---------------------------------+------------------------------------------
    Reporter:  slyfox            |       Owner:                
        Type:  bug               |      Status:  new           
    Priority:  normal            |   Component:  Runtime System
     Version:  7.0.1             |    Keywords:                
    Testcase:                    |   Blockedby:                
          Os:  Unknown/Multiple  |    Blocking:                
Architecture:  Unknown/Multiple  |     Failure:  None/Unknown  
---------------------------------+------------------------------------------
 I found out it in xmobar on ghc-7.0.1.
 When I ran it I got the following message:
 {{{
 xmobar: file descriptor 8954336 out of range for select (0--1024).
 Recompile with -threaded to work around this.
 }}}
 '''-threaded''' option works, but the message is absolutely misleading.

 I've decided to track where so large descriptor could come,
 but there was no such place.

 All xmobar does is:
 {{{
     do x11connection_fd <- connectionNumber d
        threadWaitRead (Fd fd) -- here we die
 }}}

 '''x11connection_fd''' has value '''3''' at the time of call.
 This value comes from '''libX11''' (via FFI, so I suspect it's a problem).

 Another example (might be unrelated):
 {{{
 -- a.hs
 import Control.Concurrent

 -- 12 is picked at random as guaranteed to be invalid FD
 main = threadWaitRead 12 >> print "yet input!"
 }}}

 Building:
 {{{
 $ ghc --make -fforce-recomp a.hs -o a
 [1 of 1] Compiling Main             ( a.hs, a.o )
 Linking a ...

 $ ghc --make -fforce-recomp a.hs -threaded -o a.threaded
 [1 of 1] Compiling Main             ( a.hs, a.o )
 Linking a.threaded ...
 }}}

 Running:
 {{{
 $ ./a.threaded
 a.threaded: epollControl: invalid argument (Bad file descriptor)
 }}}

 Looks good.

 And nonthreaded:
 {{{
 $ ./a
 "yet input!"
 }}}

 According to strace there was an error but it was not reported.
 {{{
 sf tmp # strace -etrace='select,write' ./a >/dev/null
 select(13, [12], [], NULL, {134, 217727}) = -1 EBADF (Bad file descriptor)
 # this one

 select(2, [], [1], NULL, {0, 0})        = 1 (out [1], left {0, 0})
 write(1, "\"yet input!\"\n", 13)        = 13
 }}}

 Side note: Haskeline seems to workaround this problem on it's own way.

 '''libraries/haskeline/System/Console/Haskeline/Backend/Posix.hsc'''
 {{{
 -- Different versions of ghc work better using different functions.
 blockUntilInput :: Handle -> IO ()
 #if __GLASGOW_HASKELL__ >= 611
 -- threadWaitRead doesn't work with the new ghc IO library,
 -- because it keeps a buffer even when NoBuffering is set.
 blockUntilInput h = hWaitForInput h (-1) >> return ()
 #else
 -- hWaitForInput doesn't work with -threaded on ghc < 6.10
 -- (#2363 in ghc's trac)
 blockUntilInput h = unsafeHandleToFd h >>= threadWaitRead
 #endif
 }}}

-- 
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/4934>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler

_______________________________________________
Glasgow-haskell-bugs mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs

Reply via email to