diff options
| author | Rob Pike <r@golang.org> | 2014-09-09 12:31:07 -0700 |
|---|---|---|
| committer | Rob Pike <r@golang.org> | 2014-09-09 12:31:07 -0700 |
| commit | d33ee0c5e52cbdc66066f54b9b2e2c930268784a (patch) | |
| tree | d8d4b803111fffa520e8e24d1a930cdbd8935c58 /src | |
| parent | eafa4fff5257ed286618d9027eeaf3cce7c6b8d0 (diff) | |
| download | go-d33ee0c5e52cbdc66066f54b9b2e2c930268784a.tar.xz | |
testing: read coverage counters atomically
For -mode=atomic, we need to read the counters
using an atomic load to avoid a race. Not worth worrying
about when -mode=atomic is set during generation
of the profile, so we use atomic loads always.
Fixes #8630.
LGTM=rsc
R=dvyukov, rsc
CC=golang-codereviews
https://golang.org/cl/141800043
Diffstat (limited to 'src')
| -rw-r--r-- | src/testing/cover.go | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/src/testing/cover.go b/src/testing/cover.go index eb7249dccd..a4ce37f7c2 100644 --- a/src/testing/cover.go +++ b/src/testing/cover.go @@ -9,6 +9,7 @@ package testing import ( "fmt" "os" + "sync/atomic" ) // CoverBlock records the coverage data for a single basic block. @@ -44,8 +45,8 @@ type Cover struct { func Coverage() float64 { var n, d int64 for _, counters := range cover.Counters { - for _, c := range counters { - if c > 0 { + for i := range counters { + if atomic.LoadUint32(&counters[i]) > 0 { n++ } d++ @@ -84,11 +85,13 @@ func coverReport() { } var active, total int64 + var count uint32 for name, counts := range cover.Counters { blocks := cover.Blocks[name] - for i, count := range counts { + for i := range counts { stmts := int64(blocks[i].Stmts) total += stmts + count = atomic.LoadUint32(&counts[i]) // For -mode=atomic. if count > 0 { active += stmts } |
