• Austin Clements's avatar
    [release-branch.go1.8] runtime: doubly fix "double wakeup" panic · 18a13d37
    Austin Clements authored
    Cherry-pick of CL 43311.
    
    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/43412
    Run-TryBot: Austin Clements <austin@google.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: 's avatarKeith Randall <khr@golang.org>
    18a13d37
Name
Last commit
Last update
..
archive Loading commit data...
bufio Loading commit data...
builtin Loading commit data...
bytes Loading commit data...
cmd Loading commit data...
compress Loading commit data...
container Loading commit data...
context Loading commit data...
crypto Loading commit data...
database/sql Loading commit data...
debug Loading commit data...
encoding Loading commit data...
errors Loading commit data...
expvar Loading commit data...
flag Loading commit data...
fmt Loading commit data...
go Loading commit data...
hash Loading commit data...
html Loading commit data...
image Loading commit data...
index/suffixarray Loading commit data...
internal Loading commit data...
io Loading commit data...
log Loading commit data...
math Loading commit data...
mime Loading commit data...
net Loading commit data...
os Loading commit data...
path Loading commit data...
plugin Loading commit data...
reflect Loading commit data...
regexp Loading commit data...
runtime Loading commit data...
sort Loading commit data...
strconv Loading commit data...
strings Loading commit data...
sync Loading commit data...
syscall Loading commit data...
testing Loading commit data...
text Loading commit data...
time Loading commit data...
unicode Loading commit data...
unsafe Loading commit data...
vendor/golang_org/x Loading commit data...
Make.dist Loading commit data...
all.bash Loading commit data...
all.bat Loading commit data...
all.rc Loading commit data...
androidtest.bash Loading commit data...
bootstrap.bash Loading commit data...
buildall.bash Loading commit data...
clean.bash Loading commit data...
clean.bat Loading commit data...
clean.rc Loading commit data...
cmp.bash Loading commit data...
iostest.bash Loading commit data...
make.bash Loading commit data...
make.bat Loading commit data...
make.rc Loading commit data...
naclmake.bash Loading commit data...
nacltest.bash Loading commit data...
race.bash Loading commit data...
race.bat Loading commit data...
run.bash Loading commit data...
run.bat Loading commit data...
run.rc Loading commit data...