diff --git a/poll_default_linux.go b/poll_default_linux.go index 2ceaab87..8f3cff0f 100644 --- a/poll_default_linux.go +++ b/poll_default_linux.go @@ -212,7 +212,7 @@ func (p *defaultPoll) Control(operator *FDOperator, event PollEvent) error { op, evt.events = syscall.EPOLL_CTL_DEL, syscall.EPOLLIN|syscall.EPOLLOUT|syscall.EPOLLRDHUP|syscall.EPOLLERR case PollWritable: operator.inuse() - op, evt.events = syscall.EPOLL_CTL_ADD, (-syscall.EPOLLET)|syscall.EPOLLOUT|syscall.EPOLLRDHUP|syscall.EPOLLERR + op, evt.events = syscall.EPOLL_CTL_ADD, EPOLLET|syscall.EPOLLOUT|syscall.EPOLLRDHUP|syscall.EPOLLERR case PollR2RW: op, evt.events = syscall.EPOLL_CTL_MOD, syscall.EPOLLIN|syscall.EPOLLOUT|syscall.EPOLLRDHUP|syscall.EPOLLERR case PollRW2R: @@ -236,32 +236,3 @@ func (p *defaultPoll) detaches(hups []*FDOperator) error { }(onhups) return nil } - -type epollevent struct { - events uint32 - data [8]byte // unaligned uintptr -} - -// EpollCtl implements epoll_ctl. -func EpollCtl(epfd int, op int, fd int, event *epollevent) (err error) { - _, _, err = syscall.RawSyscall6(syscall.SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) - if err == syscall.Errno(0) { - err = nil - } - return err -} - -// EpollWait implements epoll_wait. -func EpollWait(epfd int, events []epollevent, msec int) (n int, err error) { - var r0 uintptr - var _p0 = unsafe.Pointer(&events[0]) - if msec == 0 { - r0, _, err = syscall.RawSyscall6(syscall.SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), 0, 0, 0) - } else { - r0, _, err = syscall.Syscall6(syscall.SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) - } - if err == syscall.Errno(0) { - err = nil - } - return int(r0), err -} diff --git a/poll_race_linux.go b/poll_race_linux.go index eecafaab..24e928a4 100644 --- a/poll_race_linux.go +++ b/poll_race_linux.go @@ -220,7 +220,7 @@ func (p *defaultPoll) Control(operator *FDOperator, event PollEvent) error { case PollWritable: operator.inuse() p.m.Store(operator.FD, operator) - op, evt.Events = syscall.EPOLL_CTL_ADD, (-syscall.EPOLLET)|syscall.EPOLLOUT|syscall.EPOLLRDHUP|syscall.EPOLLERR + op, evt.Events = syscall.EPOLL_CTL_ADD, EPOLLET|syscall.EPOLLOUT|syscall.EPOLLRDHUP|syscall.EPOLLERR case PollR2RW: op, evt.Events = syscall.EPOLL_CTL_MOD, syscall.EPOLLIN|syscall.EPOLLOUT|syscall.EPOLLRDHUP|syscall.EPOLLERR case PollRW2R: diff --git a/sys_epoll_linux.go b/sys_epoll_linux.go new file mode 100644 index 00000000..da06cb3c --- /dev/null +++ b/sys_epoll_linux.go @@ -0,0 +1,53 @@ +// Copyright 2021 CloudWeGo Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build !arm64 + +package netpoll + +import ( + "syscall" + "unsafe" +) + +const EPOLLET = -syscall.EPOLLET + +type epollevent struct { + events uint32 + data [8]byte // unaligned uintptr +} + +// EpollCtl implements epoll_ctl. +func EpollCtl(epfd int, op int, fd int, event *epollevent) (err error) { + _, _, err = syscall.RawSyscall6(syscall.SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if err == syscall.Errno(0) { + err = nil + } + return err +} + +// EpollWait implements epoll_wait. +func EpollWait(epfd int, events []epollevent, msec int) (n int, err error) { + var r0 uintptr + var _p0 = unsafe.Pointer(&events[0]) + if msec == 0 { + r0, _, err = syscall.RawSyscall6(syscall.SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), 0, 0, 0) + } else { + r0, _, err = syscall.Syscall6(syscall.SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + } + if err == syscall.Errno(0) { + err = nil + } + return int(r0), err +} diff --git a/sys_epoll_linux_arm64.go b/sys_epoll_linux_arm64.go new file mode 100644 index 00000000..9d33ad16 --- /dev/null +++ b/sys_epoll_linux_arm64.go @@ -0,0 +1,52 @@ +// Copyright 2021 CloudWeGo Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package netpoll + +import ( + "syscall" + "unsafe" +) + +const EPOLLET = syscall.EPOLLET + +type epollevent struct { + events uint32 + _ int32 + data [8]byte // unaligned uintptr +} + +// EpollCtl implements epoll_ctl. +func EpollCtl(epfd int, op int, fd int, event *epollevent) (err error) { + _, _, err = syscall.RawSyscall6(syscall.SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if err == syscall.Errno(0) { + err = nil + } + return err +} + +// EpollWait implements epoll_wait. +func EpollWait(epfd int, events []epollevent, msec int) (n int, err error) { + var r0 uintptr + var _p0 = unsafe.Pointer(&events[0]) + if msec == 0 { + r0, _, err = syscall.RawSyscall6(syscall.SYS_EPOLL_PWAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), 0, 0, 0) + } else { + r0, _, err = syscall.Syscall6(syscall.SYS_EPOLL_PWAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + } + if err == syscall.Errno(0) { + err = nil + } + return int(r0), err +}