diff options
| author | 2009-01-31 17:56:55 +0000 | |
|---|---|---|
| committer | 2009-01-31 17:56:55 +0000 | |
| commit | edbd23cc9d43798c15cb5ed2e4f0b6a74920b4e5 (patch) | |
| tree | 2849b4848cbbdda91a1e165866e3dd4978e1d090 /src/socketengine_select.cpp | |
| parent | Backport from trunk, this is also lacking from the trunk backport and does th... (diff) | |
| download | inspircd++-edbd23cc9d43798c15cb5ed2e4f0b6a74920b4e5.tar.gz inspircd++-edbd23cc9d43798c15cb5ed2e4f0b6a74920b4e5.tar.bz2 inspircd++-edbd23cc9d43798c15cb5ed2e4f0b6a74920b4e5.zip | |
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
Diffstat (limited to 'src/socketengine_select.cpp')
| -rw-r--r-- | src/socketengine_select.cpp | 45 |
1 files changed, 20 insertions, 25 deletions
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; + 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); - } - } + 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; |
