| package multierror |
| |
| import "sync" |
| |
| // Group is a collection of goroutines which return errors that need to be |
| // coalesced. |
| type Group struct { |
| mutex sync.Mutex |
| err *Error |
| wg sync.WaitGroup |
| } |
| |
| // Go calls the given function in a new goroutine. |
| // |
| // If the function returns an error it is added to the group multierror which |
| // is returned by Wait. |
| func (g *Group) Go(f func() error) { |
| g.wg.Add(1) |
| |
| go func() { |
| defer g.wg.Done() |
| |
| if err := f(); err != nil { |
| g.mutex.Lock() |
| g.err = Append(g.err, err) |
| g.mutex.Unlock() |
| } |
| }() |
| } |
| |
| // Wait blocks until all function calls from the Go method have returned, then |
| // returns the multierror. |
| func (g *Group) Wait() *Error { |
| g.wg.Wait() |
| g.mutex.Lock() |
| defer g.mutex.Unlock() |
| return g.err |
| } |