• Austin Clements's avatar
    runtime: fix several issues in TestFutexsleep · 8319c578
    Austin Clements authored
    TestFutexsleep is supposed to clean up before returning by waking up
    the goroutines it started and left blocked in futex sleeps. However,
    it currently fails at this in several ways:
    
    1. Both the sleep and wakeup are done on the address of tt.mtx, but in
       both cases tt is a *local copy* of the futexsleepTest created by a
       loop, so the sleep and wakeup happen on completely different
       addresses. Fix this by making them both use the address of the
       global tt.mtx.
    
    2. If the sleep happens after the wakeup (not likely, but not
       impossible), it won't wake up. Fix this by using the futex protocol
       properly: sleep if the mutex's value is 0, and set the mutex's
       value to non-zero before doing the wakeup.
    
    3. If TestFutexsleep runs more than once, channels and mutex values
       left over from the first run will interfere with later runs. Fix
       this by clearing the mutex value and creating a new channel for
       each test and waiting for goroutines to finish before returning
       (lest they send their completion to the channel for the next run).
    
    As an added bonus, this test now actually tests that futex
    sleep/wakeup work. Previously this test would have been satisfied if
    futexsleep was an infinite loop and futexwakeup was a no-op.
    
    Change-Id: I1cbc6871cc9dcb8f4601b3621913bec2b79b0fc3
    Reviewed-on: https://go-review.googlesource.com/18617Reviewed-by: 's avatarIan Lance Taylor <iant@golang.org>
    Reviewed-by: 's avatarMikio Hara <mikioh.mikioh@gmail.com>
    8319c578
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...
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...
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/net/http2/hpack 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...
iostest.bash Loading commit data...
make.bash Loading commit data...
make.bat Loading commit data...
make.rc 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...