From a8b90a7158d4197428639c912d97f3bdbaf63f5a Mon Sep 17 00:00:00 2001 From: Brian Geffon Date: Thu, 24 May 2018 15:45:55 -0700 Subject: Poll should wake up on ECONNREFUSED with no mask. Today poll will not wake up on a ECONNREFUSED if no poll mask is specified, which is equivalent to POLLHUP | POLLERR which are implicitly added during the poll syscall. PiperOrigin-RevId: 197967183 Change-Id: I668d0730c33701228913f2d0843b48491b642efb --- pkg/tcpip/transport/tcp/connect.go | 6 ++---- pkg/waiter/waiter.go | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/pkg/tcpip/transport/tcp/connect.go b/pkg/tcpip/transport/tcp/connect.go index efd69fa86..66904856c 100644 --- a/pkg/tcpip/transport/tcp/connect.go +++ b/pkg/tcpip/transport/tcp/connect.go @@ -819,7 +819,8 @@ func (e *endpoint) protocolMainLoop(passive bool) *tcpip.Error { defer func() { // e.mu is expected to be held upon entering this section. - e.waiterQueue.Notify(waiter.EventIn | waiter.EventOut) + // When the protocol loop exits we should wake up our waiters. + e.waiterQueue.Notify(waiter.EventHUp | waiter.EventErr | waiter.EventIn | waiter.EventOut) e.completeWorkerLocked() if e.snd != nil { @@ -880,9 +881,6 @@ func (e *endpoint) protocolMainLoop(passive bool) *tcpip.Error { e.waiterQueue.Notify(waiter.EventOut) - // When the protocol loop exits we should wake up our waiters with EventHUp. - defer e.waiterQueue.Notify(waiter.EventHUp) - // Set up the functions that will be called when the main protocol loop // wakes up. funcs := []struct { diff --git a/pkg/waiter/waiter.go b/pkg/waiter/waiter.go index 56f53f9c3..ab39fa002 100644 --- a/pkg/waiter/waiter.go +++ b/pkg/waiter/waiter.go @@ -174,7 +174,7 @@ func (q *Queue) Notify(mask EventMask) { q.mu.RLock() for it := q.list.Front(); it != nil; it = it.Next() { e := it.(*Entry) - if (mask & e.mask) != 0 { + if mask&e.mask != 0 { e.Callback.Callback(e) } } -- cgit v1.2.3