kitty/tools/utils/select_without_pselect.go

32 lines
552 B
Go

//go:build darwin
package utils
import (
"os"
"time"
"golang.org/x/sys/unix"
)
// Go unix does not wrap pselect on darwin
func Select(nfd int, r *unix.FdSet, w *unix.FdSet, e *unix.FdSet, timeout time.Duration) (n int, err error) {
deadline := time.Now().Add(timeout)
for {
t := deadline.Sub(time.Now())
if t < 0 {
t = 0
}
ts := NsecToTimeval(t)
q, qerr := unix.Select(nfd, r, w, w, &ts)
if qerr == unix.EINTR {
if time.Now().After(deadline) {
return 0, os.ErrDeadlineExceeded
}
continue
}
return q, qerr
}
}