• Simon Marlow's avatar
    Fix a lost-wakeup bug in BLACKHOLE handling (#13751) · 59847290
    Simon Marlow authored
    Summary:
    The problem occurred when
    * Threads A & B evaluate the same thunk
    * Thread A context-switches, so the thunk gets blackholed
    * Thread C enters the blackhole, creates a BLOCKING_QUEUE attached to
      the blackhole and thread A's `tso->bq` queue
    * Thread B updates the blackhole with a value, overwriting the BLOCKING_QUEUE
    * We GC, replacing A's update frame with stg_enter_checkbh
    * Throw an exception in A, which ignores the stg_enter_checkbh frame
    
    Now we have C blocked on A's tso->bq queue, but we forgot to check the
    queue because the stg_enter_checkbh frame has been thrown away by the
    exception.
    
    The solution and alternative designs are discussed in Note [upd-black-hole].
    
    This also exposed a bug in the interpreter, whereby we were sometimes
    context-switching without calling `threadPaused()`.  I've fixed this
    and added some Notes.
    
    Test Plan:
    * `cd testsuite/tests/concurrent && make slow`
    * validate
    
    Reviewers: niteria, bgamari, austin, erikd
    
    Reviewed By: erikd
    
    Subscribers: rwbarton, thomie
    
    GHC Trac Issues: #13751
    
    Differential Revision: https://phabricator.haskell.org/D3630
    59847290
HeapStackCheck.cmm 19.3 KB