Fix #10017
authorAndreas Voellmy <andreas.voellmy@gmail.com>
Mon, 2 Feb 2015 15:50:52 +0000 (10:50 -0500)
committerAndreas Voellmy <andreas.voellmy@gmail.com>
Mon, 2 Feb 2015 15:50:53 +0000 (10:50 -0500)
commit92c93544939199f6ef758e1658149a971d4437c9
tree0e2a82ad85071c20128b10b39b92b75dc60fd347
parent07ee96faac4996cde0ab82789eec0b70d1a35af0
Fix #10017

Summary:
In the threaded RTS, a signal is delivered from the RTS to Haskell
user code by writing to file that one of the IO managers watches (via
an instance of GHC.Event.Control.Control). When the IO manager
receives the signal, it calls GHC.Conc.Signal.runHandlers to invoke
Haskell signal handler. In the move from a single IO manager to one IO
manager per capability, the behavior was (wrongly) extended so that a
signal is delivered to every event manager (see #9423), each of which
invoke Haskell signal handlers, leading to multiple invocations of
Haskell signal handlers for a single signal. This change fixes this
problem by having the RTS (in generic_handler()) notify only the
Control instance used by the TimerManager, rather than all the
per-capability IO managers.

Reviewers: austin, hvr, simonmar, Mikolaj

Reviewed By: simonmar, Mikolaj

Subscribers: thomie

Differential Revision: https://phabricator.haskell.org/D641
libraries/base/GHC/Event/Manager.hs
rts/posix/Signals.c
testsuite/tests/rts/T10017.hs [new file with mode: 0644]
testsuite/tests/rts/T10017.stdout [new file with mode: 0644]
testsuite/tests/rts/all.T