]> Cypherpunks repositories - gostls13.git/commitdiff
testing: read coverage counters atomically
authorRob Pike <r@golang.org>
Tue, 9 Sep 2014 19:31:07 +0000 (12:31 -0700)
committerRob Pike <r@golang.org>
Tue, 9 Sep 2014 19:31:07 +0000 (12:31 -0700)
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

src/testing/cover.go

index eb7249dccde6bc9e2b3e4220ee4c7304c02f6e28..a4ce37f7c2dfb8130685ec489ff7608d0fe691f8 100644 (file)
@@ -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
                        }