[GHC] #5553: sendWakeup error in simple test program with MVars and killThread

GHC ghc-devs at haskell.org
Fri Sep 1 19:11:03 UTC 2017


#5553: sendWakeup error in simple test program with MVars and killThread
-------------------------------------+-------------------------------------
        Reporter:  bit               |                Owner:  (none)
            Type:  bug               |               Status:  closed
        Priority:  high              |            Milestone:  8.2.2
       Component:  Runtime System    |              Version:  8.0.1
      Resolution:  fixed             |             Keywords:
Operating System:  Linux             |         Architecture:  x86
 Type of failure:  Incorrect result  |            Test Case:
  at runtime                         |
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------
Changes (by dfeuer):

 * status:  new => closed
 * resolution:   => fixed


Comment:

 I'm unable to reproduce this in 8.2.1. I think it may have been fixed by
 d5cd505bc484edee3dbd5d41fb7a27c2e18d528d

 {{{
 Author: Ben Gamari <bgamari.foss at gmail.com>
 Date:   Tue Jan 17 15:52:37 2017 -0500

     event manager: Don't worry if attempt to wake dead manager fails

     This fixes #12038, where the TimerManager would attempt to wake up a
     manager that was already dead, resulting in setnumcapabilities001
     occassionally failing during shutdown with unexpected output on
 stderr.

     I'm frankly still not entirely confident in this solution but perhaps
 it
     will help to get a few more eyes on this.

     My hypothesis is that the TimerManager is racing:

       thread                   TimerManager worker
       -------                  --------------------
       requests that thread
       manager shuts down

                                begins to clean up,
                                closing eventfd

       calls wakeManager,
       which tries to write
       to closed eventfd

     To prevent this `wakeManager` will need to synchronize with the
     TimerManger worker to ensure that the worker doesn't clean up the
     `Control` while another thread is trying to send a wakeup. However,
 this
     would add a bit of overhead on every timer interaction, which feels
     rather costly for what is really a problem only at shutdown.
 Moreover,
     it seems that the event manager (e.g.  `GHC.Event.Manager`) is also
     afflicted by a similar race.

     This patch instead simply tries to catch the write failure after it
 has
     happened and silence it in the case that the fd has vanished. It feels
     rather hacky but it seems to work.

     Test Plan: Run `setnumcapabilities001` repeatedly

     Reviewers: hvr, austin, simonmar

     Subscribers: thomie

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

     GHC Trac Issues: #12038
 }}}

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


More information about the ghc-tickets mailing list