summaryrefslogtreecommitdiffhomepage
path: root/pkg/fdnotifier
diff options
context:
space:
mode:
authorMichael Pratt <mpratt@google.com>2019-04-17 12:13:46 -0700
committerShentubot <shentubot@google.com>2019-04-17 12:15:01 -0700
commit08d99c5fbea76ecc92038280387d24ecdf7ed814 (patch)
tree76df71b51b5515098e8c61978c441e8c530526ff /pkg/fdnotifier
parente091b4e7c07056e32120ab25cc9a78ed24f7c754 (diff)
Convert poll/select to operate more directly on linux.PollFD
Current, doPoll copies the user struct pollfd array into a []syscalls.PollFD, which contains internal kdefs.FD and waiter.EventMask types. While these are currently binary-compatible with the Linux versions, we generally discourage copying directly to internal types (someone may inadvertantly change kdefs.FD to uint64). Instead, copy directly to a []linux.PollFD, which will certainly be binary compatible. Most of syscalls/polling.go is included directly into syscalls/linux/sys_poll.go, as it can then operate directly on linux.PollFD. The additional syscalls.PollFD type is providing little value. I've also added explicit conversion functions for waiter.EventMask, which creates the possibility of a different binary format. PiperOrigin-RevId: 244042947 Change-Id: I24e5b642002a32b3afb95a9dcb80d4acd1288abf
Diffstat (limited to 'pkg/fdnotifier')
-rw-r--r--pkg/fdnotifier/fdnotifier.go6
-rw-r--r--pkg/fdnotifier/poll_unsafe.go6
2 files changed, 8 insertions, 4 deletions
diff --git a/pkg/fdnotifier/fdnotifier.go b/pkg/fdnotifier/fdnotifier.go
index 624b1a0c5..aa4906ca0 100644
--- a/pkg/fdnotifier/fdnotifier.go
+++ b/pkg/fdnotifier/fdnotifier.go
@@ -12,6 +12,8 @@
// See the License for the specific language governing permissions and
// limitations under the License.
+// +build linux
+
// Package fdnotifier contains an adapter that translates IO events (e.g., a
// file became readable/writable) from native FDs to the notifications in the
// waiter package. It uses epoll in edge-triggered mode to receive notifications
@@ -70,7 +72,7 @@ func (n *notifier) waitFD(fd int32, fi *fdInfo, mask waiter.EventMask) error {
}
e := syscall.EpollEvent{
- Events: uint32(mask) | -syscall.EPOLLET,
+ Events: mask.ToLinux() | -syscall.EPOLLET,
Fd: fd,
}
@@ -155,7 +157,7 @@ func (n *notifier) waitAndNotify() error {
n.mu.Lock()
for i := 0; i < v; i++ {
if fi, ok := n.fdMap[e[i].Fd]; ok {
- fi.queue.Notify(waiter.EventMask(e[i].Events))
+ fi.queue.Notify(waiter.EventMaskFromLinux(e[i].Events))
}
}
n.mu.Unlock()
diff --git a/pkg/fdnotifier/poll_unsafe.go b/pkg/fdnotifier/poll_unsafe.go
index 8459d4c74..05be9aeb5 100644
--- a/pkg/fdnotifier/poll_unsafe.go
+++ b/pkg/fdnotifier/poll_unsafe.go
@@ -12,6 +12,8 @@
// See the License for the specific language governing permissions and
// limitations under the License.
+// +build linux
+
package fdnotifier
import (
@@ -30,7 +32,7 @@ func NonBlockingPoll(fd int32, mask waiter.EventMask) waiter.EventMask {
revents int16
}{
fd: fd,
- events: int16(mask),
+ events: int16(mask.ToLinux()),
}
for {
@@ -51,7 +53,7 @@ func NonBlockingPoll(fd int32, mask waiter.EventMask) waiter.EventMask {
}
// Otherwise we got the ready events in the revents field.
- return waiter.EventMask(e.revents)
+ return waiter.EventMaskFromLinux(uint32(e.revents))
}
}