From edbd23cc9d43798c15cb5ed2e4f0b6a74920b4e5 Mon Sep 17 00:00:00 2001 From: w00t Date: Sat, 31 Jan 2009 17:56:55 +0000 Subject: Patch fixing select to handle read/write events at the same time, from Skip (austnet). Related to bug #634. git-svn-id: http://svn.inspircd.org/repository/branches/1_1_stable@11019 e03df62e-2008-0410-955e-edbf42e46eb7 --- src/socketengine_select.cpp | 47 ++++++++++++++++++++------------------------- 1 file changed, 21 insertions(+), 26 deletions(-) (limited to 'src/socketengine_select.cpp') diff --git a/src/socketengine_select.cpp b/src/socketengine_select.cpp index c9bfaf197..541322135 100644 --- a/src/socketengine_select.cpp +++ b/src/socketengine_select.cpp @@ -127,34 +127,29 @@ int SelectEngine::DispatchEvents() */ for (int i = 0; i < result; i++) { - if (ev[i]) + if (! ev[i]) + continue; + + if (FD_ISSET (ev[i]->GetFd(), &errfdset)) { - if (FD_ISSET (ev[i]->GetFd(), &errfdset)) - { - if (ev[i]) - { - if (getsockopt(ev[i]->GetFd(), SOL_SOCKET, SO_ERROR, (char*)&errcode, &codesize) < 0) - errcode = errno; - - ev[i]->HandleEvent(EVENT_ERROR, errcode); - } - continue; - } - if (ev[i]) - { - if (writeable[ev[i]->GetFd()]) - { - writeable[ev[i]->GetFd()] = false; - if (ev[i]) - ev[i]->HandleEvent(EVENT_WRITE); - } - else - { - if (ev[i]) - ev[i]->HandleEvent(ev[i]->Readable() ? EVENT_READ : EVENT_WRITE); - } - } + if (getsockopt(ev[i]->GetFd(), SOL_SOCKET, SO_ERROR, (char*)&errcode, &codesize) < 0) + errcode = errno; + + ev[i]->HandleEvent(EVENT_ERROR, errcode); + continue; } + + if (FD_ISSET (ev[i]->GetFd(), &wfdset)) + { + writeable[ev[i]->GetFd()] = false; + ev[i]->HandleEvent(EVENT_WRITE); + } + + if (! ev[i]) + continue; + + if (FD_ISSET (ev[i]->GetFd(), &rfdset)) + ev[i]->HandleEvent(EVENT_READ); } return result; -- cgit v1.3.1-10-gc9f91