summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorCaleb Bassi <calebjbassi@gmail.com>2019-01-26 14:09:32 -0800
committerCaleb Bassi <calebjbassi@gmail.com>2019-01-26 14:10:49 -0800
commitdaf06909db4f8ba38178dcdc7936d0a0c36d820a (patch)
treea792137b869fb7da1280d156564b3a4e6f4e9429 /src
parentecd9a3223033378f2ba4c12eeaf044e3f29ab171 (diff)
Fix possible concurrent map write in cpu widget
Diffstat (limited to 'src')
-rw-r--r--src/widgets/cpu.go13
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)