Fix data race for CPU widget

This commit is contained in:
Caleb Bassi 2019-01-19 20:45:02 -08:00
parent 97f490be80
commit cf00920745

View File

@ -17,6 +17,7 @@ type CPU struct {
PerCPU bool // show per-core load PerCPU bool // show per-core load
interval time.Duration interval time.Duration
formatString string formatString string
renderLock *sync.RWMutex
} }
func NewCPU(renderLock *sync.RWMutex, interval time.Duration, horizontalScale int, average bool, percpu bool) *CPU { func NewCPU(renderLock *sync.RWMutex, interval time.Duration, horizontalScale int, average bool, percpu bool) *CPU {
@ -35,6 +36,7 @@ func NewCPU(renderLock *sync.RWMutex, interval time.Duration, horizontalScale in
Average: average, Average: average,
PerCPU: percpu, PerCPU: percpu,
formatString: formatString, formatString: formatString,
renderLock: renderLock,
} }
self.Title = " CPU Usage " self.Title = " CPU Usage "
self.HorizontalScale = horizontalScale self.HorizontalScale = horizontalScale
@ -63,9 +65,7 @@ func NewCPU(renderLock *sync.RWMutex, interval time.Duration, horizontalScale in
go func() { go func() {
ticker := time.NewTicker(self.interval) ticker := time.NewTicker(self.interval)
for range ticker.C { for range ticker.C {
renderLock.RLock()
self.update() self.update()
renderLock.RUnlock()
} }
}() }()
@ -76,6 +76,8 @@ func (self *CPU) update() {
if self.Average { if self.Average {
go func() { go func() {
percent, err := psCPU.Percent(self.interval, false) percent, err := psCPU.Percent(self.interval, false)
self.renderLock.RLock()
defer self.renderLock.RUnlock()
if err != nil { if err != nil {
log.Printf("failed to get average CPU usage percent from gopsutil: %v. self.interval: %v. percpu: %v", err, self.interval, false) log.Printf("failed to get average CPU usage percent from gopsutil: %v. self.interval: %v. percpu: %v", err, self.interval, false)
} else { } else {
@ -88,6 +90,8 @@ func (self *CPU) update() {
if self.PerCPU { if self.PerCPU {
go func() { go func() {
percents, err := psCPU.Percent(self.interval, true) percents, err := psCPU.Percent(self.interval, true)
self.renderLock.RLock()
defer self.renderLock.RUnlock()
if err != nil { if err != nil {
log.Printf("failed to get CPU usage percents from gopsutil: %v. self.interval: %v. percpu: %v", err, self.interval, true) log.Printf("failed to get CPU usage percents from gopsutil: %v. self.interval: %v. percpu: %v", err, self.interval, true)
} else { } else {