Skip to content

Commit 9ce41f3

Browse files
committed
opt: reduce the potential system calls for waking pollers up
1 parent e2ad774 commit 9ce41f3

File tree

4 files changed

+4
-4
lines changed

4 files changed

+4
-4
lines changed

internal/netpoll/epoll_default_poller.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ func (p *Poller) Polling(callback func(fd int, ev uint32) error) error {
179179
queue.PutTask(task)
180180
}
181181
atomic.StoreInt32(&p.netpollWakeSig, 0)
182-
if !p.asyncTaskQueue.Empty() || !p.priorAsyncTaskQueue.Empty() {
182+
if (!p.asyncTaskQueue.Empty() || !p.priorAsyncTaskQueue.Empty()) && atomic.CompareAndSwapInt32(&p.netpollWakeSig, 0, 1) {
183183
for _, err = unix.Write(p.wfd, b); err == unix.EINTR || err == unix.EAGAIN; _, err = unix.Write(p.wfd, b) {
184184
}
185185
}

internal/netpoll/epoll_optimized_poller.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ func (p *Poller) Polling() error {
181181
queue.PutTask(task)
182182
}
183183
atomic.StoreInt32(&p.netpollWakeSig, 0)
184-
if !p.asyncTaskQueue.Empty() || !p.priorAsyncTaskQueue.Empty() {
184+
if (!p.asyncTaskQueue.Empty() || !p.priorAsyncTaskQueue.Empty()) && atomic.CompareAndSwapInt32(&p.netpollWakeSig, 0, 1) {
185185
for _, err = unix.Write(p.wpa.FD, b); err == unix.EINTR || err == unix.EAGAIN; _, err = unix.Write(p.wpa.FD, b) {
186186
}
187187
}

internal/netpoll/kqueue_default_poller.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ func (p *Poller) Polling(callback func(fd int, filter int16) error) error {
177177
queue.PutTask(task)
178178
}
179179
atomic.StoreInt32(&p.netpollWakeSig, 0)
180-
if !p.asyncTaskQueue.Empty() || !p.priorAsyncTaskQueue.Empty() {
180+
if (!p.asyncTaskQueue.Empty() || !p.priorAsyncTaskQueue.Empty()) && atomic.CompareAndSwapInt32(&p.netpollWakeSig, 0, 1) {
181181
for _, err = unix.Kevent(p.fd, wakeChanges, nil, nil); err == unix.EINTR || err == unix.EAGAIN; _, err = unix.Kevent(p.fd, wakeChanges, nil, nil) {
182182
}
183183
}

internal/netpoll/kqueue_optimized_poller.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ func (p *Poller) Polling() error {
178178
queue.PutTask(task)
179179
}
180180
atomic.StoreInt32(&p.netpollWakeSig, 0)
181-
if !p.asyncTaskQueue.Empty() || !p.priorAsyncTaskQueue.Empty() {
181+
if (!p.asyncTaskQueue.Empty() || !p.priorAsyncTaskQueue.Empty()) && atomic.CompareAndSwapInt32(&p.netpollWakeSig, 0, 1) {
182182
for _, err = unix.Kevent(p.fd, wakeChanges, nil, nil); err == unix.EINTR || err == unix.EAGAIN; _, err = unix.Kevent(p.fd, wakeChanges, nil, nil) {
183183
}
184184
}

0 commit comments

Comments
 (0)