diff options
author | Dmitriy Vyukov <dvyukov@google.com> | 2013-06-25 20:27:19 +0400 |
---|---|---|
committer | Dmitriy Vyukov <dvyukov@google.com> | 2013-06-25 20:27:19 +0400 |
commit | 31d4ee6227d6a390712b66cb077c1e38df026e49 (patch) | |
tree | 1dd0e7cdb00ede7d288c80be427df9b0090af3c5 /src/lib9/execl.c | |
parent | 4565e17ef604590c462036b8b449e87f34ba26f9 (diff) | |
download | go-31d4ee6227d6a390712b66cb077c1e38df026e49.tar.gz |
sync: fix race instrumentation of WaitGroup
Currently more than 1 gorutine can execute raceWrite() in Wait()
in the following scenario:
1. goroutine 1 executes first check of wg.counter, sees that it's == 0
2. goroutine 2 executes first check of wg.counter, sees that it's == 0
3. goroutine 2 locks the mutex, sees that he is the first waiter and executes raceWrite()
4. goroutine 2 block on the semaphore
5. goroutine 3 executes Done() and unblocks goroutine 2
6. goroutine 1 lock the mutex, sees that he is the first waiter and executes raceWrite()
It produces the following false report:
WARNING: DATA RACE
Write by goroutine 35:
sync.raceWrite()
src/pkg/sync/race.go:41 +0x33
sync.(*WaitGroup).Wait()
src/pkg/sync/waitgroup.go:103 +0xae
command-line-arguments_test.TestNoRaceWaitGroupMultipleWait2()
src/pkg/runtime/race/testdata/waitgroup_test.go:156 +0x19a
testing.tRunner()
src/pkg/testing/testing.go:361 +0x108
Previous write by goroutine 36:
sync.raceWrite()
src/pkg/sync/race.go:41 +0x33
sync.(*WaitGroup).Wait()
src/pkg/sync/waitgroup.go:103 +0xae
command-line-arguments_test.func?012()
src/pkg/runtime/race/testdata/waitgroup_test.go:148 +0x4d
R=golang-dev, r
CC=golang-dev
https://codereview.appspot.com/10424043
Diffstat (limited to 'src/lib9/execl.c')
0 files changed, 0 insertions, 0 deletions