blob: ed2adb8412dda74a948bf5646aa8a67040477fa5 [file] [log] [blame]
package timeout
import (
"fmt"
"time"
)
var (
ErrTimedOut = fmt.Errorf("Function call timed out.")
)
// Run the given function with the given timeout. Return any error returned by
// the function, or ErrTimedOut if the timeout took place. The function is not
// interrupted if the timeout takes place.
func Run(fn func() error, timeout time.Duration) error {
c := make(chan error, 1)
go func() {
c <- fn()
close(c)
}()
t := time.NewTimer(timeout)
defer t.Stop()
select {
case err := <-c:
return err
case <-t.C:
return ErrTimedOut
}
}