summaryrefslogtreecommitdiff
path: root/src/tcp_listener.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/tcp_listener.cpp')
-rw-r--r--src/tcp_listener.cpp9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/tcp_listener.cpp b/src/tcp_listener.cpp
index 5e1dcc9..2fda819 100644
--- a/src/tcp_listener.cpp
+++ b/src/tcp_listener.cpp
@@ -198,19 +198,24 @@ int xs::tcp_listener_t::set_address (const char *addr_)
xs::fd_t xs::tcp_listener_t::accept ()
{
// Accept one connection and deal with different failure modes.
+ // The situation where connection cannot be accepted due to insufficient
+ // resources is considered valid and treated by ignoring the connection.
xs_assert (s != retired_fd);
fd_t sock = ::accept (s, NULL, NULL);
#ifdef XS_HAVE_WINDOWS
if (sock == INVALID_SOCKET) {
wsa_assert (WSAGetLastError () == WSAEWOULDBLOCK ||
- WSAGetLastError () == WSAECONNRESET);
+ WSAGetLastError () == WSAECONNRESET ||
+ WSAGetLastError () == WSAEMFILE ||
+ WSAGetLastError () == WSAENOBUFS);
return retired_fd;
}
#else
if (sock == -1) {
errno_assert (errno == EAGAIN || errno == EWOULDBLOCK ||
errno == EINTR || errno == ECONNABORTED || errno == EPROTO ||
- errno == ENOBUFS);
+ errno == ENOBUFS || errno == ENOMEM || errno == EMFILE ||
+ errno == ENFILE);
return retired_fd;
}
#endif