waitforread.go 896 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. //go:build !windows && !plan9
  2. package eunix
  3. import (
  4. "os"
  5. "time"
  6. "golang.org/x/sys/unix"
  7. )
  8. // WaitForRead blocks until any of the given files is ready to be read or
  9. // timeout. A negative timeout means no timeout. It returns a boolean array
  10. // indicating which files are ready to be read and any possible error.
  11. func WaitForRead(timeout time.Duration, files ...*os.File) (ready []bool, err error) {
  12. maxfd := 0
  13. fdset := &unix.FdSet{}
  14. for _, file := range files {
  15. fd := int(file.Fd())
  16. if maxfd < fd {
  17. maxfd = fd
  18. }
  19. fdset.Set(fd)
  20. }
  21. _, err = unix.Select(maxfd+1, fdset, nil, nil, optionalTimeval(timeout))
  22. ready = make([]bool, len(files))
  23. for i, file := range files {
  24. ready[i] = fdset.IsSet(int(file.Fd()))
  25. }
  26. return ready, err
  27. }
  28. func optionalTimeval(d time.Duration) *unix.Timeval {
  29. if d < 0 {
  30. return nil
  31. }
  32. timeval := unix.NsecToTimeval(int64(d))
  33. return &timeval
  34. }