aboutsummaryrefslogtreecommitdiff
path: root/src/testing
diff options
context:
space:
mode:
authorRob Pike <r@golang.org>2014-09-09 12:31:07 -0700
committerRob Pike <r@golang.org>2014-09-09 12:31:07 -0700
commitd33ee0c5e52cbdc66066f54b9b2e2c930268784a (patch)
treed8d4b803111fffa520e8e24d1a930cdbd8935c58 /src/testing
parenteafa4fff5257ed286618d9027eeaf3cce7c6b8d0 (diff)
downloadgo-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/testing')
-rw-r--r--src/testing/cover.go9
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
}