mirror of
https://github.com/golang/go
synced 2024-11-19 18:04:40 -07:00
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
This commit is contained in:
parent
eafa4fff52
commit
d33ee0c5e5
@ -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
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user