(Feat): Initial Commit
This commit is contained in:
30
internal/util/wait_group.go
Normal file
30
internal/util/wait_group.go
Normal file
@@ -0,0 +1,30 @@
|
||||
// nolint:revive
|
||||
package util
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
var (
|
||||
ErrWaitTimeout = errors.New("WaitGroup has timed out")
|
||||
)
|
||||
|
||||
// WaitTimeout waits for the waitgroup for the specified max timeout.
|
||||
// Returns nil on completion or ErrWaitTimeout if waiting timed out.
|
||||
// See https://stackoverflow.com/questions/32840687/timeout-for-waitgroup-wait
|
||||
// Note that the spawned goroutine to wg.Wait() gets leaked and will continue running detached
|
||||
func WaitTimeout(wg *sync.WaitGroup, timeout time.Duration) error {
|
||||
waitChan := make(chan struct{})
|
||||
go func() {
|
||||
defer close(waitChan)
|
||||
wg.Wait()
|
||||
}()
|
||||
select {
|
||||
case <-waitChan:
|
||||
return nil // completed normally
|
||||
case <-time.After(timeout):
|
||||
return ErrWaitTimeout // timed out
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user