Skip to content

Commit 606435c

Browse files
authored
progress: plug possible race conditions (#144)
1 parent f507204 commit 606435c

File tree

2 files changed

+19
-12
lines changed

2 files changed

+19
-12
lines changed

progress/progress.go

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,13 @@ const (
6565
// to a queue, which gets picked up by the Render logic in the next rendering
6666
// cycle.
6767
func (p *Progress) AppendTracker(t *Tracker) {
68+
t.mutex.Lock()
6869
if t.Total < 0 {
6970
t.Total = math.MaxInt64
7071
}
72+
t.mutex.Unlock()
7173
t.start()
74+
7275
p.overallTrackerMutex.Lock()
7376
if p.overallTracker == nil {
7477
p.overallTracker = &Tracker{Total: 1}
@@ -109,38 +112,42 @@ func (p *Progress) Length() int {
109112
p.trackersActiveMutex.RLock()
110113
p.trackersDoneMutex.RLock()
111114
p.trackersInQueueMutex.RLock()
112-
defer p.trackersActiveMutex.RUnlock()
113-
defer p.trackersDoneMutex.RUnlock()
114-
defer p.trackersInQueueMutex.RUnlock()
115+
out := len(p.trackersInQueue) + len(p.trackersActive) + len(p.trackersDone)
116+
p.trackersInQueueMutex.RUnlock()
117+
p.trackersDoneMutex.RUnlock()
118+
p.trackersActiveMutex.RUnlock()
115119

116-
return len(p.trackersInQueue) + len(p.trackersActive) + len(p.trackersDone)
120+
return out
117121
}
118122

119123
// LengthActive returns the number of Trackers actively tracked (not done yet).
120124
func (p *Progress) LengthActive() int {
121125
p.trackersActiveMutex.RLock()
122126
p.trackersInQueueMutex.RLock()
123-
defer p.trackersActiveMutex.RUnlock()
124-
defer p.trackersInQueueMutex.RUnlock()
127+
out := len(p.trackersInQueue) + len(p.trackersActive)
128+
p.trackersInQueueMutex.RUnlock()
129+
p.trackersActiveMutex.RUnlock()
125130

126-
return len(p.trackersInQueue) + len(p.trackersActive)
131+
return out
127132
}
128133

129134
// LengthDone returns the number of Trackers that are done tracking.
130135
func (p *Progress) LengthDone() int {
131136
p.trackersDoneMutex.RLock()
132-
defer p.trackersDoneMutex.RUnlock()
137+
out := len(p.trackersDone)
138+
p.trackersDoneMutex.RUnlock()
133139

134-
return len(p.trackersDone)
140+
return out
135141
}
136142

137143
// LengthInQueue returns the number of Trackers in queue to be actively tracked
138144
// (not tracking yet).
139145
func (p *Progress) LengthInQueue() int {
140146
p.trackersInQueueMutex.RLock()
141-
defer p.trackersInQueueMutex.RUnlock()
147+
out := len(p.trackersInQueue)
148+
p.trackersInQueueMutex.RUnlock()
142149

143-
return len(p.trackersInQueue)
150+
return out
144151
}
145152

146153
// SetAutoStop toggles the auto-stop functionality. Auto-stop set to true would

progress/render.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,8 @@ func (p *Progress) consumeQueuedTrackers() {
8686
p.trackersInQueueMutex.Lock()
8787
p.trackersActive = append(p.trackersActive, p.trackersInQueue...)
8888
p.trackersInQueue = make([]*Tracker, 0)
89-
p.trackersActiveMutex.Unlock()
9089
p.trackersInQueueMutex.Unlock()
90+
p.trackersActiveMutex.Unlock()
9191
}
9292
}
9393

0 commit comments

Comments
 (0)