• Austin Clements's avatar
    runtime: doubly fix "double wakeup" panic · 3b5637ff
    Austin Clements authored
    runtime.gchelper depends on the non-atomic load of work.ndone
    happening strictly before the atomic add of work.nwait. Until very
    recently (commit 978af9c2, fixing #20334), the compiler reordered
    these operations. This created a race since work.ndone can change as
    soon as work.nwait is equal to work.ndone. If that happened, more than
    one gchelper could attempt to wake up the work.alldone note, causing a
    "double wakeup" panic.
    
    This was fixed in the compiler, but to make this code less subtle,
    make the load of work.ndone atomic. This clearly forces the order of
    these operations, ensuring the race doesn't happen.
    
    Fixes #19305 (though really 978af9c2 fixed it).
    
    Change-Id: Ieb1a84e1e5044c33ac612c8a5ab6297e7db4c57d
    Reviewed-on: https://go-review.googlesource.com/43311
    Run-TryBot: Austin Clements <austin@google.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: 's avatarKeith Randall <khr@golang.org>
    3b5637ff
mgc.go 70.8 KB