diff options
author | Caleb Bassi <calebjbassi@gmail.com> | 2019-01-26 14:09:32 -0800 |
---|---|---|
committer | Caleb Bassi <calebjbassi@gmail.com> | 2019-01-26 14:10:49 -0800 |
commit | daf06909db4f8ba38178dcdc7936d0a0c36d820a (patch) | |
tree | a792137b869fb7da1280d156564b3a4e6f4e9429 /src | |
parent | ecd9a3223033378f2ba4c12eeaf044e3f29ab171 (diff) |
Fix possible concurrent map write in cpu widget
Diffstat (limited to 'src')
-rw-r--r-- | src/widgets/cpu.go | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/src/widgets/cpu.go b/src/widgets/cpu.go index a7b0300..aaa7d07 100644 --- a/src/widgets/cpu.go +++ b/src/widgets/cpu.go @@ -18,6 +18,7 @@ type CPU struct { interval time.Duration formatString string renderLock *sync.RWMutex + updateLock sync.Mutex } func NewCPU(renderLock *sync.RWMutex, interval time.Duration, horizontalScale int, average bool, percpu bool) *CPU { @@ -76,11 +77,13 @@ func (self *CPU) update() { if self.Average { go func() { percent, err := psCPU.Percent(self.interval, false) - self.renderLock.RLock() - defer self.renderLock.RUnlock() if err != nil { log.Printf("failed to get average CPU usage percent from gopsutil: %v. self.interval: %v. percpu: %v", err, self.interval, false) } else { + self.renderLock.RLock() + defer self.renderLock.RUnlock() + self.updateLock.Lock() + defer self.updateLock.Unlock() self.Data["AVRG"] = append(self.Data["AVRG"], percent[0]) self.Labels["AVRG"] = fmt.Sprintf("%3.0f%%", percent[0]) } @@ -90,14 +93,16 @@ func (self *CPU) update() { if self.PerCPU { go func() { percents, err := psCPU.Percent(self.interval, true) - self.renderLock.RLock() - defer self.renderLock.RUnlock() if err != nil { log.Printf("failed to get CPU usage percents from gopsutil: %v. self.interval: %v. percpu: %v", err, self.interval, true) } else { if len(percents) != self.Count { log.Printf("error: number of CPU usage percents from gopsutil doesn't match CPU count. percents: %v. self.Count: %v", percents, self.Count) } else { + self.renderLock.RLock() + defer self.renderLock.RUnlock() + self.updateLock.Lock() + defer self.updateLock.Unlock() for i, percent := range percents { k := fmt.Sprintf(self.formatString, i) self.Data[k] = append(self.Data[k], percent) |