+++ /dev/null
-// +build !windows
-
-/* SPDX-License-Identifier: MIT
- *
- * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
- */
-
-package rwcancel
-
-import "golang.org/x/sys/unix"
-
-type fdSet struct {
- unix.FdSet
-}
-
-func (fdset *fdSet) set(i int) {
- bits := 32 << (^uint(0) >> 63)
- fdset.Bits[i/bits] |= 1 << uint(i%bits)
-}
-
-func (fdset *fdSet) check(i int) bool {
- bits := 32 << (^uint(0) >> 63)
- return (fdset.Bits[i/bits] & (1 << uint(i%bits))) != 0
-}
"golang.org/x/sys/unix"
)
-func max(a, b int) int {
- if a > b {
- return a
- }
- return b
-}
-
type RWCancel struct {
fd int
closingReader *os.File
}
func (rw *RWCancel) ReadyRead() bool {
- closeFd := int(rw.closingReader.Fd())
- fdset := fdSet{}
- fdset.set(rw.fd)
- fdset.set(closeFd)
+ closeFd := int32(rw.closingReader.Fd())
+
+ pollFds := []unix.PollFd{{Fd: int32(rw.fd), Events: unix.POLLIN}, {Fd: closeFd, Events: unix.POLLIN}}
var err error
for {
- err = unixSelect(max(rw.fd, closeFd)+1, &fdset.FdSet, nil, nil, nil)
+ _, err = unix.Poll(pollFds, -1)
if err == nil || !RetryAfterError(err) {
break
}
if err != nil {
return false
}
- if fdset.check(closeFd) {
+ if pollFds[1].Revents != 0 {
return false
}
- return fdset.check(rw.fd)
+ return pollFds[0].Revents != 0
}
func (rw *RWCancel) ReadyWrite() bool {
- closeFd := int(rw.closingReader.Fd())
- fdset := fdSet{}
- fdset.set(rw.fd)
- fdset.set(closeFd)
+ closeFd := int32(rw.closingReader.Fd())
+ pollFds := []unix.PollFd{{Fd: int32(rw.fd), Events: unix.POLLOUT}, {Fd: closeFd, Events: unix.POLLOUT}}
var err error
for {
- err = unixSelect(max(rw.fd, closeFd)+1, nil, &fdset.FdSet, nil, nil)
+ _, err = unix.Poll(pollFds, -1)
if err == nil || !RetryAfterError(err) {
break
}
if err != nil {
return false
}
- if fdset.check(closeFd) {
+
+ if pollFds[1].Revents != 0 {
return false
}
- return fdset.check(rw.fd)
+ return pollFds[0].Revents != 0
}
func (rw *RWCancel) Read(p []byte) (n int, err error) {
+++ /dev/null
-// +build !linux,!windows
-
-/* SPDX-License-Identifier: MIT
- *
- * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
- */
-
-package rwcancel
-
-import "golang.org/x/sys/unix"
-
-func unixSelect(nfd int, r *unix.FdSet, w *unix.FdSet, e *unix.FdSet, timeout *unix.Timeval) error {
- _, err := unix.Select(nfd, r, w, e, timeout)
- return err
-}
+++ /dev/null
-/* SPDX-License-Identifier: MIT
- *
- * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
- */
-
-package rwcancel
-
-import "golang.org/x/sys/unix"
-
-func unixSelect(nfd int, r *unix.FdSet, w *unix.FdSet, e *unix.FdSet, timeout *unix.Timeval) (err error) {
- _, err = unix.Select(nfd, r, w, e, timeout)
- return
-}