From ee88c22ca0066dc2cb03012f6457faf8ef7224ca Mon Sep 17 00:00:00 2001 From: Milosz Tanski Date: Wed, 6 Nov 2013 16:56:57 -0500 Subject: [PATCH] Don't use errno in socket accept code. Switch to using non-inlined lastError() function. When we switch stacks for fibers we might using an old cached pointer to the errno memory value. This is due to how errno is implemented on Linux. --- mordor/socket.cpp | 10 +++++----- mordor/streams/fd.cpp | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/mordor/socket.cpp b/mordor/socket.cpp index 65321500..d29ee0e5 100644 --- a/mordor/socket.cpp +++ b/mordor/socket.cpp @@ -515,7 +515,7 @@ Socket::connect(const Address &to) // Worked first time return; } - if (errno == EINPROGRESS) { + if (lastError() == EINPROGRESS) { m_ioManager->registerEvent(m_sock, IOManager::WRITE); if (m_cancelledSend) { MORDOR_LOG_ERROR(g_log) << this << " connect(" << m_sock << ", " << to @@ -744,7 +744,7 @@ Socket::accept(Socket &target) error_t error; do { newsock = ::accept(m_sock, NULL, NULL); - error = errno; + error = lastError(); } while (newsock == -1 && error == EINTR); while (newsock == -1 && error == EAGAIN) { m_ioManager->registerEvent(m_sock, IOManager::READ); @@ -770,7 +770,7 @@ Socket::accept(Socket &target) } do { newsock = ::accept(m_sock, NULL, NULL); - error = errno; + error = lastError(); } while (newsock == -1 && error == EINTR); } if (newsock == -1) { @@ -956,7 +956,7 @@ Socket::doIO(iovec *buffers, size_t length, int &flags, Address *address) error_t error; do { rc = isSend ? sendmsg(m_sock, &msg, flags) : recvmsg(m_sock, &msg, flags); - error = errno; + error = lastError(); } while (rc == -1 && error == EINTR); while (m_ioManager && rc == -1 && error == EAGAIN) { m_ioManager->registerEvent(m_sock, event); @@ -974,7 +974,7 @@ Socket::doIO(iovec *buffers, size_t length, int &flags, Address *address) } do { rc = isSend ? sendmsg(m_sock, &msg, flags) : recvmsg(m_sock, &msg, flags); - error = errno; + error = lastError(); } while (rc == -1 && error == EINTR); } MORDOR_SOCKET_LOG(rc, error); diff --git a/mordor/streams/fd.cpp b/mordor/streams/fd.cpp index 363a1938..273fd2cd 100644 --- a/mordor/streams/fd.cpp +++ b/mordor/streams/fd.cpp @@ -83,7 +83,7 @@ FDStream::read(Buffer &buffer, size_t length) length = 0xfffffffe; std::vector iovs = buffer.writeBuffers(length); int rc = readv(m_fd, &iovs[0], iovs.size()); - while (rc < 0 && errno == EAGAIN && m_ioManager) { + while (rc < 0 && lastError() == EAGAIN && m_ioManager) { MORDOR_LOG_TRACE(g_log) << this << " readv(" << m_fd << ", " << length << "): " << rc << " (EAGAIN)"; m_ioManager->registerEvent(m_fd, IOManager::READ); @@ -112,7 +112,7 @@ FDStream::read(void *buffer, size_t length) if (length > 0xfffffffe) length = 0xfffffffe; int rc = ::read(m_fd, buffer, length); - while (rc < 0 && errno == EAGAIN && m_ioManager) { + while (rc < 0 && lastError() == EAGAIN && m_ioManager) { MORDOR_LOG_TRACE(g_log) << this << " read(" << m_fd << ", " << length << "): " << rc << " (EAGAIN)"; m_ioManager->registerEvent(m_fd, IOManager::READ); @@ -149,7 +149,7 @@ FDStream::write(const Buffer &buffer, size_t length) length = 0xfffffffe; const std::vector iovs = buffer.readBuffers(length); int rc = writev(m_fd, &iovs[0], iovs.size()); - while (rc < 0 && errno == EAGAIN && m_ioManager) { + while (rc < 0 && lastError() == EAGAIN && m_ioManager) { MORDOR_LOG_TRACE(g_log) << this << " writev(" << m_fd << ", " << length << "): " << rc << " (EAGAIN)"; m_ioManager->registerEvent(m_fd, IOManager::WRITE); @@ -179,7 +179,7 @@ FDStream::write(const void *buffer, size_t length) if (length > 0xfffffffe) length = 0xfffffffe; int rc = ::write(m_fd, buffer, length); - while (rc < 0 && errno == EAGAIN && m_ioManager) { + while (rc < 0 && lastError() == EAGAIN && m_ioManager) { MORDOR_LOG_TRACE(g_log) << this << " write(" << m_fd << ", " << length << "): " << rc << " (EAGAIN)"; m_ioManager->registerEvent(m_fd, IOManager::WRITE);