Workaround for go unix package not wrapping pselect() on darwin

This commit is contained in:
Kovid Goyal
2022-08-21 11:22:36 +05:30
parent 141b9c8f08
commit 2e31178980
2 changed files with 60 additions and 0 deletions

View File

@@ -0,0 +1,29 @@
//go:build !darwin
package utils
import (
"os"
"time"
"golang.org/x/sys/unix"
)
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 := NsecToTimespec(t)
q, qerr := unix.Pselect(nfd, r, w, w, &ts, nil)
if qerr == unix.EINTR {
if time.Now().After(deadline) {
return 0, os.ErrDeadlineExceeded
}
continue
}
return q, qerr
}
}

View File

@@ -0,0 +1,31 @@
//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
}
}