Skip to content
  • Simon Marlow's avatar
    Don't call DEAD_WEAK finalizer again on shutdown (#7170) · dfdc50d6
    Simon Marlow authored
    Summary:
    There's a race condition like this:
    
      # A foreign pointer gets promoted to the last generation
      # It has its finalizer called manually
      # We start shutting down the runtime in `hs_exit_` from the main
        thread
      # A minor GC starts running (`scheduleDoGC`) on one of the threads
      # The minor GC notices that we're in `SCHED_INTERRUPTING` state and
        advances to `SCHED_SHUTTING_DOWN`
      # The main thread tries to do major GC (with `scheduleDoGC`), but it
        exits early because we're in `SCHED_SHUTTING_DOWN` state
      # We end up with a `DEAD_WEAK` left on the list of weak pointers of
        the last generation, because it relied on major GC removing it from
        that list
    
    This change:
      * Ignores DEAD_WEAK finalizers when shutting down
      * Makes the major GC on shutdown more likely
      * Fixes a bogus assert
    
    Test Plan:
    before this diff https://ghc.haskell.org/trac/ghc/ticket/7170#comment:5
    reproduced and after it doesn't
    
    Reviewers: ezyang, austin, simonmar
    
    Reviewed By: simonmar
    
    Subscribers: bgamari, thomie
    
    Differential Revision: https://phabricator.haskell.org/D921
    
    GHC Trac Issues: #7170
    dfdc50d6