rwcancel: use ppoll on Linux for Android

This is a temporary measure while we wait for
https://go-review.googlesource.com/c/sys/+/352310 to land.

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
This commit is contained in:
Jason A. Donenfeld 2021-09-26 17:15:58 -06:00
parent 217ac1016b
commit fcc601dbf0
3 changed files with 34 additions and 2 deletions

17
rwcancel/poll_linux.go Normal file
View File

@ -0,0 +1,17 @@
/* SPDX-License-Identifier: MIT
*
* Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
*/
package rwcancel
import "golang.org/x/sys/unix"
func poll(fds []unix.PollFd, timeout int) (n int, err error) {
var ts *unix.Timespec
if timeout >= 0 {
ts = new(unix.Timespec)
*ts = unix.NsecToTimespec(int64(timeout) * 1e6)
}
return unix.Ppoll(fds, ts, nil)
}

15
rwcancel/poll_unix.go Normal file
View File

@ -0,0 +1,15 @@
//go:build !windows && !linux
// +build !windows,!linux
/* SPDX-License-Identifier: MIT
*
* Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
*/
package rwcancel
import "golang.org/x/sys/unix"
func poll(fds []unix.PollFd, timeout int) (n int, err error) {
return unix.Poll(fds, timeout)
}

View File

@ -49,7 +49,7 @@ func (rw *RWCancel) ReadyRead() bool {
pollFds := []unix.PollFd{{Fd: int32(rw.fd), Events: unix.POLLIN}, {Fd: closeFd, Events: unix.POLLIN}} pollFds := []unix.PollFd{{Fd: int32(rw.fd), Events: unix.POLLIN}, {Fd: closeFd, Events: unix.POLLIN}}
var err error var err error
for { for {
_, err = unix.Poll(pollFds, -1) _, err = poll(pollFds, -1)
if err == nil || !RetryAfterError(err) { if err == nil || !RetryAfterError(err) {
break break
} }
@ -68,7 +68,7 @@ func (rw *RWCancel) ReadyWrite() bool {
pollFds := []unix.PollFd{{Fd: int32(rw.fd), Events: unix.POLLOUT}, {Fd: closeFd, Events: unix.POLLOUT}} pollFds := []unix.PollFd{{Fd: int32(rw.fd), Events: unix.POLLOUT}, {Fd: closeFd, Events: unix.POLLOUT}}
var err error var err error
for { for {
_, err = unix.Poll(pollFds, -1) _, err = poll(pollFds, -1)
if err == nil || !RetryAfterError(err) { if err == nil || !RetryAfterError(err) {
break break
} }