1
0
mirror of https://github.com/anope/anope.git synced 2026-06-28 23:26:39 +02:00

Fix a few issues with the poll socketengine

This commit is contained in:
Adam
2013-05-06 23:48:18 -04:00
parent 6578829fa6
commit c7f77b3b66
+7 -14
View File
@@ -32,7 +32,6 @@
#endif
static std::vector<pollfd> events;
static unsigned SocketCount;
static std::map<int, unsigned> socket_positions;
void SocketEngine::Init()
@@ -59,17 +58,14 @@ void SocketEngine::Change(Socket *s, bool set, SocketFlag flag)
if (!before_registered && now_registered)
{
if (SocketCount >= events.size())
events.resize(events.size() * 2);
pollfd &ev = events[SocketCount];
pollfd ev;
memset(&ev, 0, sizeof(ev));
ev.fd = s->GetFD();
ev.events = (s->flags[SF_READABLE] ? POLLIN : 0) | (s->flags[SF_WRITABLE] ? POLLOUT : 0);
socket_positions[ev.fd] = SocketCount;
++SocketCount;
socket_positions[ev.fd] = events.size();
events.push_back(ev);
}
else if (before_registered && !now_registered)
{
@@ -77,10 +73,10 @@ void SocketEngine::Change(Socket *s, bool set, SocketFlag flag)
if (pos == socket_positions.end())
throw SocketException("Unable to remove fd " + stringify(s->GetFD()) + " from poll, it does not exist?");
if (pos->second != SocketCount - 1)
if (pos->second != events.size() - 1)
{
pollfd &ev = events[pos->second],
&last_ev = events[SocketCount - 1];
&last_ev = events[events.size() - 1];
ev = last_ev;
@@ -88,7 +84,7 @@ void SocketEngine::Change(Socket *s, bool set, SocketFlag flag)
}
socket_positions.erase(pos);
--SocketCount;
events.pop_back();
}
else if (before_registered && now_registered)
{
@@ -103,9 +99,6 @@ void SocketEngine::Change(Socket *s, bool set, SocketFlag flag)
void SocketEngine::Process()
{
if (Sockets.size() > events.size())
events.resize(events.size() * 2);
int total = poll(&events.front(), events.size(), Config->ReadTimeout * 1000);
Anope::CurTime = time(NULL);
@@ -117,7 +110,7 @@ void SocketEngine::Process()
return;
}
for (unsigned i = 0, processed = 0; i < SocketCount && processed != static_cast<unsigned>(total); ++i)
for (unsigned i = 0, processed = 0; i < events.size() && processed != static_cast<unsigned>(total); ++i)
{
pollfd *ev = &events[i];