rts/base: Fix #9423
authorAndreas Voellmy <andreas.voellmy@gmail.com>
Tue, 19 Aug 2014 13:02:18 +0000 (08:02 -0500)
committerAustin Seipp <austin@well-typed.com>
Tue, 19 Aug 2014 13:03:34 +0000 (08:03 -0500)
commitf9f89b7884ccc8ee5047cf4fffdf2b36df6832df
tree2871a2b4bca35ed8f2cecdb71d72ce66885a2c54
parent51a0b60038fb1dddbb9793c0c069de6125f84bf1
rts/base: Fix #9423

Summary:
Fix #9423.

The problem in #9423 is caused when code invoked by `hs_exit()` waits
on all foreign calls to return, but some IO managers are in `safe` foreign
calls and do not return. The previous design signaled to the timer manager
(via its control pipe) that it should "die" and when the timer manager
returned to Haskell-land, the Haskell code in timer manager then signalled
to the IO manager threads that they should return from foreign calls and
`die`. Unfortunately, in the shutdown sequence the timer manager is unable
to return to Haskell-land fast enough and so the code that signals to the
IO manager threads (via their control pipes) is never executed and the IO
manager threads remain out in the foreign calls.

This patch solves this problem by having the RTS signal to all the IO
manager threads (via their control pipes; and in addition to signalling
to the timer manager thread) that they should shutdown (in `ioManagerDie()`
in `rts/Signals.c`. To do this, we arrange for each IO manager thread to
register its control pipe with the RTS (in `GHC.Thread.startIOManagerThread`).
In addition, `GHC.Thread.startTimerManagerThread` registers its control pipe.
These are registered via C functions `setTimerManagerControlFd` (in
`rts/Signals.c`) and `setIOManagerControlFd` (in `rts/Capability.c`). The IO
manager control pipe file descriptors are stored in a new field of the
`Capability_ struct`.

Test Plan: See the notes on #9423 to recreate the problem and to verify that it no longer occurs with the fix.

Auditors: simonmar

Reviewers: simonmar, edsko, ezyang, austin

Reviewed By: austin

Subscribers: phaskell, simonmar, ezyang, carter, relrod

Differential Revision: https://phabricator.haskell.org/D129

GHC Trac Issues: #9423, #9284
includes/rts/IOManager.h
libraries/base/GHC/Event/Control.hs
libraries/base/GHC/Event/Manager.hs
libraries/base/GHC/Event/Thread.hs
libraries/base/GHC/Event/TimerManager.hs
rts/Capability.c
rts/Capability.h
rts/Linker.c
rts/posix/Signals.c