Merge pull request #37 from thekondor/1.8.1-fix-group-wait-race

Synchronize read & write of `TaskGroupWithContext`'s `err` variable
This commit is contained in:
Alejandro Durante
2022-10-14 08:12:48 -03:00
committed by GitHub
+14 -3
View File
@@ -34,7 +34,11 @@ type TaskGroupWithContext struct {
TaskGroup TaskGroup
ctx context.Context ctx context.Context
cancel context.CancelFunc cancel context.CancelFunc
errOnce sync.Once
errSync struct {
once sync.Once
guard sync.RWMutex
}
err error err error
} }
@@ -57,8 +61,11 @@ func (g *TaskGroupWithContext) Submit(task func() error) {
// don't actually ignore errors // don't actually ignore errors
err := task() err := task()
if err != nil { if err != nil {
g.errOnce.Do(func() { g.errSync.once.Do(func() {
g.errSync.guard.Lock()
g.err = err g.err = err
g.errSync.guard.Unlock()
if g.cancel != nil { if g.cancel != nil {
g.cancel() g.cancel()
} }
@@ -86,5 +93,9 @@ func (g *TaskGroupWithContext) Wait() error {
case <-g.ctx.Done(): case <-g.ctx.Done():
} }
return g.err g.errSync.guard.RLock()
err := g.err
g.errSync.guard.RUnlock()
return err
} }