[GHC] #8684: hWaitForInput cannot be interrupted by async exceptions on unix

GHC ghc-devs at haskell.org
Fri Sep 15 01:35:58 UTC 2017


#8684: hWaitForInput cannot be interrupted by async exceptions on unix
-------------------------------------+-------------------------------------
        Reporter:  nh2               |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Core Libraries    |              Version:  7.6.3
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:  13497, 13525      |             Blocking:
 Related Tickets:  #12912, #13525    |  Differential Rev(s):  Phab:D42
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by nh2):

 OK, looking at the definition of `timeout`
 [http://hackage.haskell.org/package/base-4.10.0.0/docs/src/System.Timeout.html#timeout
 here], and making an instrumented copy of it into my test case file, it
 seems that the `threadDelay n >> throwTo pid ex` is never executed.

 The `cap 0: throwTo: from thread 1 to thread 2` I observe at the very end
 is from `killThread`.

 Changing it into this

 {{{
         handleJust (\e -> if e == ex then Just () else Nothing)
                    (\_ -> return Nothing)
                    (bracket (forkIOWithUnmask $ \unmask -> do
                                  putStrLn "before unmask"
                                  unmask $ putStrLn "before delay" >>
 threadDelay n >> putStrLn "delay over" >> throwTo pid ex)
                             (\x -> putStrLn "before killThread" >>
 uninterruptibleMask_ (killThread x))
                             (\_ -> fmap Just f))
 }}}

 yields the output at the very end:

 {{{
 fdReady called with msecs = 0
 fdReady res = 1
 before killThread
 fdReady called with msecs = 0
 fdReady res = 1
 before unmask
 }}}

 and then the program terminates.

 This suggests that nothing inside `unmask` is ever executed in my non-
 threaded case, and that the thread started with `forkIOWithUnmask` doesn't
 actually run until `hWaitForInput` is over.

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


More information about the ghc-tickets mailing list