From fcc601dbf0f6b626ec1d47a880cbe64f9c8fe385 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Sun, 26 Sep 2021 17:15:58 -0600 Subject: [PATCH] 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 --- rwcancel/poll_linux.go | 17 +++++++++++++++++ rwcancel/poll_unix.go | 15 +++++++++++++++ rwcancel/rwcancel.go | 4 ++-- 3 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 rwcancel/poll_linux.go create mode 100644 rwcancel/poll_unix.go diff --git a/rwcancel/poll_linux.go b/rwcancel/poll_linux.go new file mode 100644 index 0000000..d9938c5 --- /dev/null +++ b/rwcancel/poll_linux.go @@ -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) +} diff --git a/rwcancel/poll_unix.go b/rwcancel/poll_unix.go new file mode 100644 index 0000000..37e9686 --- /dev/null +++ b/rwcancel/poll_unix.go @@ -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) +} diff --git a/rwcancel/rwcancel.go b/rwcancel/rwcancel.go index 7013b16..45cc73b 100644 --- a/rwcancel/rwcancel.go +++ b/rwcancel/rwcancel.go @@ -49,7 +49,7 @@ func (rw *RWCancel) ReadyRead() bool { pollFds := []unix.PollFd{{Fd: int32(rw.fd), Events: unix.POLLIN}, {Fd: closeFd, Events: unix.POLLIN}} var err error for { - _, err = unix.Poll(pollFds, -1) + _, err = poll(pollFds, -1) if err == nil || !RetryAfterError(err) { 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}} var err error for { - _, err = unix.Poll(pollFds, -1) + _, err = poll(pollFds, -1) if err == nil || !RetryAfterError(err) { break }