29 lines
700 B
Go
29 lines
700 B
Go
![]() |
package goselect
|
||
|
|
||
|
import (
|
||
|
"syscall"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
// Select wraps syscall.Select with Go types
|
||
|
func Select(n int, r, w, e *FDSet, timeout time.Duration) error {
|
||
|
var timeval *syscall.Timeval
|
||
|
if timeout >= 0 {
|
||
|
t := syscall.NsecToTimeval(timeout.Nanoseconds())
|
||
|
timeval = &t
|
||
|
}
|
||
|
|
||
|
return sysSelect(n, r, w, e, timeval)
|
||
|
}
|
||
|
|
||
|
// RetrySelect wraps syscall.Select with Go types, and retries a number of times, with a given retryDelay.
|
||
|
func RetrySelect(n int, r, w, e *FDSet, timeout time.Duration, retries int, retryDelay time.Duration) (err error) {
|
||
|
for i := 0; i < retries; i++ {
|
||
|
if err = Select(n, r, w, e, timeout); err != syscall.EINTR {
|
||
|
return err
|
||
|
}
|
||
|
time.Sleep(retryDelay)
|
||
|
}
|
||
|
return err
|
||
|
}
|