summaryrefslogtreecommitdiff
path: root/src/socketengines/socketengine_poll.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/socketengines/socketengine_poll.cpp')
-rw-r--r--src/socketengines/socketengine_poll.cpp148
1 files changed, 0 insertions, 148 deletions
diff --git a/src/socketengines/socketengine_poll.cpp b/src/socketengines/socketengine_poll.cpp
deleted file mode 100644
index e9a81933b..000000000
--- a/src/socketengines/socketengine_poll.cpp
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- *
- * (C) 2003-2024 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-#include "services.h"
-#include "anope.h"
-#include "sockets.h"
-#include "socketengine.h"
-#include "config.h"
-
-#include <errno.h>
-
-#ifndef _WIN32
-# include <sys/poll.h>
-# include <poll.h>
-# include <sys/types.h>
-# include <sys/time.h>
-# include <sys/resource.h>
-# ifndef POLLRDHUP
-# define POLLRDHUP 0
-# endif
-#else
-# define poll WSAPoll
-# define POLLRDHUP POLLHUP
-#endif
-
-static std::vector<pollfd> events;
-static std::map<int, unsigned> socket_positions;
-
-void SocketEngine::Init()
-{
- events.resize(DefaultSize);
-}
-
-void SocketEngine::Shutdown()
-{
- while (!Sockets.empty())
- delete Sockets.begin()->second;
-}
-
-void SocketEngine::Change(Socket *s, bool set, SocketFlag flag)
-{
- if (set == s->flags[flag])
- return;
-
- bool before_registered = s->flags[SF_READABLE] || s->flags[SF_WRITABLE];
-
- s->flags[flag] = set;
-
- bool now_registered = s->flags[SF_READABLE] || s->flags[SF_WRITABLE];
-
- if (!before_registered && now_registered)
- {
- 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] = events.size();
- events.push_back(ev);
- }
- else if (before_registered && !now_registered)
- {
- std::map<int, unsigned>::iterator pos = socket_positions.find(s->GetFD());
- if (pos == socket_positions.end())
- throw SocketException("Unable to remove fd " + stringify(s->GetFD()) + " from poll, it does not exist?");
-
- if (pos->second != events.size() - 1)
- {
- pollfd &ev = events[pos->second],
- &last_ev = events[events.size() - 1];
-
- ev = last_ev;
-
- socket_positions[ev.fd] = pos->second;
- }
-
- socket_positions.erase(pos);
- events.pop_back();
- }
- else if (before_registered && now_registered)
- {
- std::map<int, unsigned>::iterator pos = socket_positions.find(s->GetFD());
- if (pos == socket_positions.end())
- throw SocketException("Unable to modify fd " + stringify(s->GetFD()) + " in poll, it does not exist?");
-
- pollfd &ev = events[pos->second];
- ev.events = (s->flags[SF_READABLE] ? POLLIN : 0) | (s->flags[SF_WRITABLE] ? POLLOUT : 0);
- }
-}
-
-void SocketEngine::Process()
-{
- int total = poll(&events.front(), events.size(), Config->ReadTimeout * 1000);
- Anope::CurTime = time(NULL);
-
- /* EINTR can be given if the read timeout expires */
- if (total < 0)
- {
- if (errno != EINTR)
- Log() << "SockEngine::Process(): error: " << Anope::LastError();
- return;
- }
-
- for (unsigned i = 0, processed = 0; i < events.size() && processed != static_cast<unsigned>(total); ++i)
- {
- pollfd *ev = &events[i];
-
- if (ev->revents != 0)
- ++processed;
-
- std::map<int, Socket *>::iterator it = Sockets.find(ev->fd);
- if (it == Sockets.end())
- continue;
- Socket *s = it->second;
-
- if (ev->revents & (POLLERR | POLLRDHUP))
- {
- s->ProcessError();
- delete s;
- continue;
- }
-
- if (!s->Process())
- {
- if (s->flags[SF_DEAD])
- delete s;
- continue;
- }
-
- if ((ev->revents & POLLIN) && !s->ProcessRead())
- s->flags[SF_DEAD] = true;
-
- if ((ev->revents & POLLOUT) && !s->ProcessWrite())
- s->flags[SF_DEAD] = true;
-
- if (s->flags[SF_DEAD])
- delete s;
- }
-}