summaryrefslogtreecommitdiff
path: root/src/socketengines/socketengine_select.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/socketengines/socketengine_select.cpp')
-rw-r--r--src/socketengines/socketengine_select.cpp15
1 files changed, 5 insertions, 10 deletions
diff --git a/src/socketengines/socketengine_select.cpp b/src/socketengines/socketengine_select.cpp
index ad6e04ca9..cd755278e 100644
--- a/src/socketengines/socketengine_select.cpp
+++ b/src/socketengines/socketengine_select.cpp
@@ -92,21 +92,22 @@ void SocketEngine::Process()
else if (sresult)
{
int processed = 0;
- for (std::map<int, Socket *>::const_iterator it = Sockets.begin(), it_end = Sockets.end(); it != it_end && processed != sresult; ++it)
+ for (std::map<int, Socket *>::const_iterator it = Sockets.begin(), it_end = Sockets.end(); it != it_end && processed != sresult;)
{
Socket *s = it->second;
+ ++it;
bool has_read = FD_ISSET(s->GetFD(), &rfdset), has_write = FD_ISSET(s->GetFD(), &wfdset), has_error = FD_ISSET(s->GetFD(), &efdset);
if (has_read || has_write || has_error)
++processed;
- if (s->HasFlag(SF_DEAD))
- continue;
-
if (has_error)
{
+ socklen_t sz = sizeof(errno);
+ getsockopt(s->GetFD(), SOL_SOCKET, SO_ERROR, &errno, &sz);
s->ProcessError();
s->SetFlag(SF_DEAD);
+ delete s;
continue;
}
@@ -118,12 +119,6 @@ void SocketEngine::Process()
if (has_write && !s->ProcessWrite())
s->SetFlag(SF_DEAD);
- }
-
- for (std::map<int, Socket *>::iterator it = Sockets.begin(), it_end = Sockets.end(); it != it_end; )
- {
- Socket *s = it->second;
- ++it;
if (s->HasFlag(SF_DEAD))
delete s;