Merge pull request #131 from yhat/cpu-race-condition-fix

CPU race condition fix
pull/129/merge
shirou 9 years ago
commit ff98b44420

@ -67,8 +67,3 @@ func (c CPUInfoStat) String() string {
s, _ := json.Marshal(c) s, _ := json.Marshal(c)
return string(s) return string(s)
} }
func init() {
lastCPUTimes, _ = CPUTimes(false)
lastPerCPUTimes, _ = CPUTimes(true)
}

@ -2,12 +2,10 @@
package cpu package cpu
import "time" import (
"fmt"
func init() { "time"
lastCPUTimes, _ = CPUTimes(false) )
lastPerCPUTimes, _ = CPUTimes(true)
}
func CPUPercent(interval time.Duration, percpu bool) ([]float64, error) { func CPUPercent(interval time.Duration, percpu bool) ([]float64, error) {
getAllBusy := func(t CPUTimesStat) (float64, float64) { getAllBusy := func(t CPUTimesStat) (float64, float64) {
@ -29,33 +27,33 @@ func CPUPercent(interval time.Duration, percpu bool) ([]float64, error) {
return (t2Busy - t1Busy) / (t2All - t1All) * 100 return (t2Busy - t1Busy) / (t2All - t1All) * 100
} }
cpuTimes, err := CPUTimes(percpu) // Get CPU usage at the start of the interval.
cpuTimes1, err := CPUTimes(percpu)
if err != nil { if err != nil {
return nil, err return nil, err
} }
if interval > 0 { if interval > 0 {
if !percpu {
lastCPUTimes = cpuTimes
} else {
lastPerCPUTimes = cpuTimes
}
time.Sleep(interval) time.Sleep(interval)
cpuTimes, err = CPUTimes(percpu)
if err != nil {
return nil, err
}
} }
ret := make([]float64, len(cpuTimes)) // And at the end of the interval.
if !percpu { cpuTimes2, err := CPUTimes(percpu)
ret[0] = calculate(lastCPUTimes[0], cpuTimes[0]) if err != nil {
lastCPUTimes = cpuTimes return nil, err
} else { }
for i, t := range cpuTimes {
ret[i] = calculate(lastPerCPUTimes[i], t) // Make sure the CPU measurements have the same length.
} if len(cpuTimes1) != len(cpuTimes2) {
lastPerCPUTimes = cpuTimes return nil, fmt.Errorf(
"received two CPU counts: %d != %d",
len(cpuTimes1), len(cpuTimes2),
)
}
ret := make([]float64, len(cpuTimes1))
for i, t := range cpuTimes2 {
ret[i] = calculate(cpuTimes1[i], t)
} }
return ret, nil return ret, nil
} }

Loading…
Cancel
Save