summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorent Le Coz <louiz@louiz.org>2014-05-26 22:27:43 +0200
committerFlorent Le Coz <louiz@louiz.org>2014-05-26 22:27:43 +0200
commit6b0ffb5fc2eca537e2cfaf24acb8a4d2ca9b99f1 (patch)
treec40b56af4a4d1bf408d0434d165ca329abc408ea
parent7fb0b671bbe6150d60b9f1efd4d8abc885c23844 (diff)
downloadbiboumi-6b0ffb5fc2eca537e2cfaf24acb8a4d2ca9b99f1.tar.gz
biboumi-6b0ffb5fc2eca537e2cfaf24acb8a4d2ca9b99f1.tar.bz2
biboumi-6b0ffb5fc2eca537e2cfaf24acb8a4d2ca9b99f1.tar.xz
biboumi-6b0ffb5fc2eca537e2cfaf24acb8a4d2ca9b99f1.zip
If both write and read events are available on a socket, only do the read
Because the read handler may discover that the connection has been closed, and then remove the socket from the poller. It that case it is no longer valid to try to call the write handler (which may try to reconnect, but since that socket is no longer managed, this is not OK).
-rw-r--r--src/network/poller.cpp2
1 files changed, 1 insertions, 1 deletions
diff --git a/src/network/poller.cpp b/src/network/poller.cpp
index dbea856..708fe23 100644
--- a/src/network/poller.cpp
+++ b/src/network/poller.cpp
@@ -185,7 +185,7 @@ int Poller::poll(const std::chrono::milliseconds& timeout)
auto socket_handler = static_cast<SocketHandler*>(revents[i].data.ptr);
if (revents[i].events & EPOLLIN)
socket_handler->on_recv();
- if (revents[i].events & EPOLLOUT)
+ else if (revents[i].events & EPOLLOUT)
{
if (socket_handler->is_connected())
socket_handler->on_send();