Skip to content

Commit

Permalink
opt: prevent the event-list from expanding or shrinking endlessly
Browse files Browse the repository at this point in the history
  • Loading branch information
panjf2000 committed Sep 9, 2021
1 parent 90bea0e commit b220dfd
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 8 deletions.
16 changes: 12 additions & 4 deletions internal/netpoll/epoll_events.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ type IOEvent = uint32
const (
// InitPollEventsCap represents the initial capacity of poller event-list.
InitPollEventsCap = 128
// MaxPollEventsCap is the maximum limitation of events that the poller can process.
MaxPollEventsCap = 1024
// MinPollEventsCap is the minimum limitation of events that the poller can process.
MinPollEventsCap = 32
// MaxAsyncTasksAtOneTime is the maximum amount of asynchronous tasks that the event-loop will process at one time.
MaxAsyncTasksAtOneTime = 256
// ErrEvents represents exceptional events that are not read/write, like socket being closed,
Expand All @@ -51,11 +55,15 @@ func newEventList(size int) *eventList {
}

func (el *eventList) expand() {
el.size <<= 1
el.events = make([]epollevent, el.size)
if newSize := el.size << 1; newSize <= MaxPollEventsCap {
el.size = newSize
el.events = make([]epollevent, newSize)
}
}

func (el *eventList) shrink() {
el.size >>= 1
el.events = make([]epollevent, el.size)
if newSize := el.size >> 1; newSize >= MinPollEventsCap {
el.size = newSize
el.events = make([]epollevent, newSize)
}
}
16 changes: 12 additions & 4 deletions internal/netpoll/kqueue_events.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ type IOEvent = int16
const (
// InitPollEventsCap represents the initial capacity of poller event-list.
InitPollEventsCap = 64
// MaxPollEventsCap is the maximum limitation of events that the poller can process.
MaxPollEventsCap = 512
// MinPollEventsCap is the minimum limitation of events that the poller can process.
MinPollEventsCap = 16
// MaxAsyncTasksAtOneTime is the maximum amount of asynchronous tasks that the event-loop will process at one time.
MaxAsyncTasksAtOneTime = 128
// EVFilterWrite represents writeable events from sockets.
Expand All @@ -51,11 +55,15 @@ func newEventList(size int) *eventList {
}

func (el *eventList) expand() {
el.size <<= 1
el.events = make([]unix.Kevent_t, el.size)
if newSize := el.size << 1; newSize <= MaxPollEventsCap {
el.size = newSize
el.events = make([]unix.Kevent_t, newSize)
}
}

func (el *eventList) shrink() {
el.size >>= 1
el.events = make([]unix.Kevent_t, el.size)
if newSize := el.size >> 1; newSize >= MinPollEventsCap {
el.size = newSize
el.events = make([]unix.Kevent_t, newSize)
}
}

0 comments on commit b220dfd

Please sign in to comment.