]> Cypherpunks repositories - gostls13.git/commit
runtime: fix several issues in TestFutexsleep
authorAustin Clements <austin@google.com>
Wed, 13 Jan 2016 20:14:26 +0000 (15:14 -0500)
committerAustin Clements <austin@google.com>
Thu, 14 Jan 2016 03:47:49 +0000 (03:47 +0000)
commit8319c578906249ce0871a485acb2334a6cf54d6c
treeef8446fe2959760d37a8f35eced0bfbbc5e8416c
parent8534429181ea99c86a5ccefee508f573ae6d4ba2
runtime: fix several issues in TestFutexsleep

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/18617
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Mikio Hara <mikioh.mikioh@gmail.com>
src/runtime/futex_test.go