select.go 700 B

12345678910111213141516171819202122232425262728
  1. package goselect
  2. import (
  3. "syscall"
  4. "time"
  5. )
  6. // Select wraps syscall.Select with Go types
  7. func Select(n int, r, w, e *FDSet, timeout time.Duration) error {
  8. var timeval *syscall.Timeval
  9. if timeout >= 0 {
  10. t := syscall.NsecToTimeval(timeout.Nanoseconds())
  11. timeval = &t
  12. }
  13. return sysSelect(n, r, w, e, timeval)
  14. }
  15. // RetrySelect wraps syscall.Select with Go types, and retries a number of times, with a given retryDelay.
  16. func RetrySelect(n int, r, w, e *FDSet, timeout time.Duration, retries int, retryDelay time.Duration) (err error) {
  17. for i := 0; i < retries; i++ {
  18. if err = Select(n, r, w, e, timeout); err != syscall.EINTR {
  19. return err
  20. }
  21. time.Sleep(retryDelay)
  22. }
  23. return err
  24. }