]> Cypherpunks repositories - gostls13.git/commit
sync: fix race instrumentation of WaitGroup
authorDmitriy Vyukov <dvyukov@google.com>
Tue, 25 Jun 2013 16:27:19 +0000 (20:27 +0400)
committerDmitriy Vyukov <dvyukov@google.com>
Tue, 25 Jun 2013 16:27:19 +0000 (20:27 +0400)
commit07cb48c31fbe1c2ee6d4996b882b296e162e4464
treebe48a1dcd0d681c7c9bce6377286d256597fff0a
parent3d513faa6f41cb6a02a69a0729beef6ccc594d0e
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://golang.org/cl/10424043
src/pkg/sync/waitgroup.go