Skip to content

Commit

Permalink
opt: improve event poll
Browse files Browse the repository at this point in the history
fix: fix an issue in poll about handling errors
  • Loading branch information
panjf2000 committed Jan 27, 2021
1 parent fee6aca commit fc042cc
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 7 deletions.
13 changes: 10 additions & 3 deletions internal/netpoll/epoll.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ package netpoll

import (
"os"
"runtime"
"unsafe"

"github.com/panjf2000/gnet/errors"
Expand Down Expand Up @@ -93,12 +94,18 @@ func (p *Poller) Polling(callback func(fd int, ev uint32) error) error {
el := newEventList(InitEvents)
var wakenUp bool

var msec = -1
for {
n, err := unix.EpollWait(p.fd, el.events, -1)
if err != nil && err != unix.EINTR {
logging.DefaultLogger.Warnf("Error occurs in epoll: %v", os.NewSyscallError("epoll_wait", err))
n, err := unix.EpollWait(p.fd, el.events, msec)
if n == 0 || (n < 0 && err == unix.EINTR) {
msec = -1
runtime.Gosched()
continue
} else if err != nil {
logging.DefaultLogger.Warnf("Error occurs in epoll: %v", os.NewSyscallError("epoll_wait", err))
return err
}
msec = 0

for i := 0; i < n; i++ {
if fd := int(el.events[i].Fd); fd != p.wfd {
Expand Down
16 changes: 13 additions & 3 deletions internal/netpoll/kqueue.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ package netpoll

import (
"os"
"runtime"

"github.com/panjf2000/gnet/errors"
"github.com/panjf2000/gnet/internal"
Expand Down Expand Up @@ -84,12 +85,21 @@ func (p *Poller) Polling(callback func(fd int, filter int16) error) error {
el := newEventList(InitEvents)
var wakenUp bool

var (
ts unix.Timespec
tsp *unix.Timespec
)
for {
n, err := unix.Kevent(p.fd, nil, el.events, nil)
if err != nil && err != unix.EINTR {
logging.DefaultLogger.Warnf("Error occurs in kqueue: %v", os.NewSyscallError("kevent wait", err))
n, err := unix.Kevent(p.fd, nil, el.events, tsp)
if n == 0 || (n < 0 && err == unix.EINTR) {
tsp = nil
runtime.Gosched()
continue
} else if err != nil {
logging.DefaultLogger.Warnf("Error occurs in kqueue: %v", os.NewSyscallError("kevent wait", err))
return err
}
tsp = &ts

var evFilter int16
for i := 0; i < n; i++ {
Expand Down
2 changes: 1 addition & 1 deletion internal/netpoll/netpoll_posix.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright (c) 2019 Andy Pan
// Copyright (c) 2021 Andy Pan
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
Expand Down

0 comments on commit fc042cc

Please sign in to comment.