Skip to content

Commit c078fb8

Browse files
authored
progress: fix possible race in Stop(); fixes #322 (#332)
1 parent 2a8f60e commit c078fb8

File tree

1 file changed

+41
-35
lines changed

1 file changed

+41
-35
lines changed

progress/progress.go

+41-35
Original file line numberDiff line numberDiff line change
@@ -23,37 +23,38 @@ var (
2323

2424
// Progress helps track progress for one or more tasks.
2525
type Progress struct {
26-
autoStop bool
27-
lengthMessage int
28-
lengthProgress int
29-
lengthProgressOverall int
30-
lengthTracker int
31-
logsToRender []string
32-
logsToRenderMutex sync.RWMutex
33-
numTrackersExpected int64
34-
outputWriter io.Writer
35-
overallTracker *Tracker
36-
overallTrackerMutex sync.RWMutex
37-
pinnedMessages []string
38-
pinnedMessageMutex sync.RWMutex
39-
pinnedMessageNumLines int
40-
renderContext context.Context
41-
renderContextCancel context.CancelFunc
42-
renderInProgress bool
43-
renderInProgressMutex sync.RWMutex
44-
sortBy SortBy
45-
style *Style
46-
terminalWidth int
47-
terminalWidthMutex sync.RWMutex
48-
terminalWidthOverride int
49-
trackerPosition Position
50-
trackersActive []*Tracker
51-
trackersActiveMutex sync.RWMutex
52-
trackersDone []*Tracker
53-
trackersDoneMutex sync.RWMutex
54-
trackersInQueue []*Tracker
55-
trackersInQueueMutex sync.RWMutex
56-
updateFrequency time.Duration
26+
autoStop bool
27+
lengthMessage int
28+
lengthProgress int
29+
lengthProgressOverall int
30+
lengthTracker int
31+
logsToRender []string
32+
logsToRenderMutex sync.RWMutex
33+
numTrackersExpected int64
34+
outputWriter io.Writer
35+
overallTracker *Tracker
36+
overallTrackerMutex sync.RWMutex
37+
pinnedMessages []string
38+
pinnedMessageMutex sync.RWMutex
39+
pinnedMessageNumLines int
40+
renderContext context.Context
41+
renderContextCancel context.CancelFunc
42+
renderContextCancelMutex sync.Mutex
43+
renderInProgress bool
44+
renderInProgressMutex sync.RWMutex
45+
sortBy SortBy
46+
style *Style
47+
terminalWidth int
48+
terminalWidthMutex sync.RWMutex
49+
terminalWidthOverride int
50+
trackerPosition Position
51+
trackersActive []*Tracker
52+
trackersActiveMutex sync.RWMutex
53+
trackersDone []*Tracker
54+
trackersDoneMutex sync.RWMutex
55+
trackersInQueue []*Tracker
56+
trackersInQueueMutex sync.RWMutex
57+
updateFrequency time.Duration
5758
}
5859

5960
// Position defines the position of the Tracker with respect to the Tracker's
@@ -284,7 +285,10 @@ func (p *Progress) ShowValue(show bool) {
284285

285286
// Stop stops the Render() logic that is in progress.
286287
func (p *Progress) Stop() {
287-
if p.IsRenderInProgress() {
288+
p.renderContextCancelMutex.Lock()
289+
defer p.renderContextCancelMutex.Unlock()
290+
291+
if p.renderContextCancel != nil {
288292
p.renderContextCancel()
289293
}
290294
}
@@ -309,15 +313,17 @@ func (p *Progress) getTerminalWidth() int {
309313
}
310314

311315
func (p *Progress) initForRender() {
316+
// reset the signals
317+
p.renderContextCancelMutex.Lock()
318+
p.renderContext, p.renderContextCancel = context.WithCancel(context.Background())
319+
p.renderContextCancelMutex.Unlock()
320+
312321
// pick a default style
313322
p.Style()
314323
if p.style.Options.SpeedOverallFormatter == nil {
315324
p.style.Options.SpeedOverallFormatter = FormatNumber
316325
}
317326

318-
// reset the signals
319-
p.renderContext, p.renderContextCancel = context.WithCancel(context.Background())
320-
321327
// pick default lengths if no valid ones set
322328
if p.lengthTracker <= 0 {
323329
p.lengthTracker = DefaultLengthTracker

0 commit comments

Comments
 (0)