[GHC] #8684: hWaitForInput cannot be interrupted by async exceptions on unix
GHC
ghc-devs at haskell.org
Fri Sep 15 00:41:23 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 new info with the power of `-debug` and `+RTS -Ds`:
In non`-threaded`, it does raise the exception, but _after_ the entire
`hWaitForInput` is over.
I can see it in `cap 0: raising exception in thread 2.`, and also the
reason:
`timeout`'s `throwTo ` also only happens **after** `hWaitForInput` is over
(it prints `cap 0: throwTo: from thread 1 to thread 2` only at the very
end).
So that means it's not the exception handling that's not working, it's the
throwing.
My C code returns back into Haskell land, but there is no exception there
at the time so it continues.
----
On my debug commit
https://github.com/nh2/ghc/blob/49a5e9ce7062da7594bfd86ca7af92796b84b52a/libraries/base/cbits/inputReady.c#L53-L68
that looks like this (relevant output without `-debug` in
[https://gist.github.com/nh2/f543030a9b68b1530b19087d0c655115 this gist]):
{{{
cap 0: running thread 1 (ThreadRunGHC)
cap 0: thread 1 stopped (suspended while making a foreign call)
fdReady called with msecs = 20
fdReady res = -1
cap 0: running thread 1 (ThreadRunGHC)
cap 0: thread 1 stopped (suspended while making a foreign call)
fdReady called with msecs = 10
fdReady res = -1
cap 0: running thread 1 (ThreadRunGHC)
cap 0: thread 1 stopped (suspended while making a foreign call)
fdReady called with msecs = 0
fdReady res = 0
cap 0: running thread 1 (ThreadRunGHC)
cap 0: throwTo: from thread 1 to thread 2
thread 2 @ 0x42001059d0 is blocked until 558048911098409
(TSO_DIRTY)
cap 0: raising exception in thread 2.
cap 0: thread 1 stopped (finished)
bound thread (1) finished
task exiting
}}}
Observe here how `cap 0: throwTo: from thread 1 to thread 2` is after the
`fdReady called with msecs = 0` (`hWaitForInput` ran its entire 5
seconds).
----
So now we just need to find out why `timeout` doesn't result in a prompt
`cap 0: throwTo: from thread 1 to thread 2` after 1 second.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/8684#comment:16>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list