diff options
author | Adam <Adam@anope.org> | 2012-11-01 13:32:38 -0400 |
---|---|---|
committer | Adam <Adam@anope.org> | 2012-11-01 14:47:23 -0400 |
commit | 90930619bc124e94bac5048c0b13c3f4748b559d (patch) | |
tree | cbe2325f6295aa188a6dd0f0d56d336eab060bbe /src/socketengines/socketengine_kqueue.cpp | |
parent | 5b1c8230191fa626ef9210c5035f14a8df4c0ed6 (diff) |
Fixed quite a bit of dumbness with m_ssl. Had to
modify socketengines to allow polling for write &
no read, but is it cleaner now. Made m_httpd able
to listen using SSL.
Diffstat (limited to 'src/socketengines/socketengine_kqueue.cpp')
-rw-r--r-- | src/socketengines/socketengine_kqueue.cpp | 111 |
1 files changed, 40 insertions, 71 deletions
diff --git a/src/socketengines/socketengine_kqueue.cpp b/src/socketengines/socketengine_kqueue.cpp index cc5909934..549773d75 100644 --- a/src/socketengines/socketengine_kqueue.cpp +++ b/src/socketengines/socketengine_kqueue.cpp @@ -11,8 +11,8 @@ #include "services.h" #include "anope.h" -#include "socketengine.h" #include "sockets.h" +#include "socketengine.h" #include "logger.h" #include "config.h" @@ -21,19 +21,14 @@ #include <sys/time.h> #include <errno.h> -static int kq_fd, max_fds; -static struct kevent *change_events, *event_events; -static int change_count; +static int kq_fd; +static std::vector<struct kevent> change_events, event_events; +static unsigned change_count; -static struct kevent *GetChangeEvent() +static inline struct kevent *GetChangeEvent() { - if (change_count == max_fds) - { - timespec zero_timespec = { 0, 0 }; - for (int i = 0; i < change_count; ++i) - kevent(kq_fd, &change_events[i], 1, NULL, 0, &zero_timespec); - change_count = 0; - } + if (change_count == change_events.size()) + change_events.resize(change_count * 2); return &change_events[change_count++]; } @@ -41,78 +36,49 @@ static struct kevent *GetChangeEvent() void SocketEngine::Init() { kq_fd = kqueue(); - max_fds = getdtablesize(); if (kq_fd < 0) throw SocketException("Unable to create kqueue engine: " + Anope::LastError()); - else if (max_fds <= 0) - throw SocketException("Can't determine maximum number of open sockets"); - - change_events = new struct kevent[max_fds]; - event_events = new struct kevent[max_fds]; - - change_count = 0; + + change_events.resize(DefaultSize); + event_events.resize(DefaultSize); } void SocketEngine::Shutdown() { - for (std::map<int, Socket *>::const_iterator it = Sockets.begin(), it_end = Sockets.end(); it != it_end;) - { - Socket *s = it->second; - ++it; - delete s; - } - Sockets.clear(); - - delete [] change_events; - delete [] event_events; -} - -void SocketEngine::AddSocket(Socket *s) -{ - struct kevent *event = GetChangeEvent(); - EV_SET(event, s->GetFD(), EVFILT_READ, EV_ADD, 0, 0, NULL); - - Sockets[s->GetFD()] = s; -} - -void SocketEngine::DelSocket(Socket *s) -{ - struct kevent *event = GetChangeEvent(); - EV_SET(event, s->GetFD(), EVFILT_READ, EV_DELETE, 0, 0, NULL); - - event = GetChangeEvent(); - EV_SET(event, s->GetFD(), EVFILT_WRITE, EV_DELETE, 0, 0, NULL); - - Sockets.erase(s->GetFD()); + while (!Sockets.empty()) + delete Sockets.begin()->second; } -void SocketEngine::MarkWritable(Socket *s) +void SocketEngine::Change(Socket *s, bool set, SocketFlag flag) { - if (s->HasFlag(SF_WRITABLE)) + if (set == s->HasFlag(flag)) return; - struct kevent *event = GetChangeEvent(); - EV_SET(event, s->GetFD(), EVFILT_WRITE, EV_ADD, 0, 0, NULL); - - s->SetFlag(SF_WRITABLE); -} - -void SocketEngine::ClearWritable(Socket *s) -{ - if (!s->HasFlag(SF_WRITABLE)) + if (set) + s->SetFlag(flag); + else + s->UnsetFlag(flag); + + int mod; + if (flag == SF_READABLE) + mod = EVFILT_READ; + else if (flag == SF_WRITABLE) + mod = EVFILT_WRITE; + else return; struct kevent *event = GetChangeEvent(); - EV_SET(event, s->GetFD(), EVFILT_WRITE, EV_DELETE, 0, 0, NULL); - - s->UnsetFlag(SF_WRITABLE); + EV_SET(event, s->GetFD(), mod, set ? EV_ADD : EV_DELETE, 0, 0, NULL); } void SocketEngine::Process() { + if (Sockets.size() > event_events.size()) + event_events.resize(event_events.size() * 2); + static timespec kq_timespec = { Config->ReadTimeout, 0 }; - int total = kevent(kq_fd, change_events, change_count, event_events, max_fds, &kq_timespec); + int total = kevent(kq_fd, &change_events.front(), change_count, &event_events.front(), event_events.size(), &kq_timespec); change_count = 0; Anope::CurTime = time(NULL); @@ -126,29 +92,32 @@ void SocketEngine::Process() for (int i = 0; i < total; ++i) { - struct kevent *event = &event_events[i]; - if (event->flags & EV_ERROR) + struct kevent &event = event_events[i]; + if (event.flags & EV_ERROR) continue; - std::map<int, Socket *>::iterator it = Sockets.find(event->ident); + std::map<int, Socket *>::iterator it = Sockets.find(event.ident); if (it == Sockets.end()) continue; Socket *s = it->second; - if (event->flags & EV_EOF) + if (event.flags & EV_EOF) { s->ProcessError(); - s->SetFlag(SF_DEAD); delete s; continue; } if (!s->Process()) + { + if (s->HasFlag(SF_DEAD)) + delete s; continue; + } - if (event->filter == EVFILT_READ && !s->ProcessRead()) + if (event.filter == EVFILT_READ && !s->ProcessRead()) s->SetFlag(SF_DEAD); - else if (event->filter == EVFILT_WRITE && !s->ProcessWrite()) + else if (event.filter == EVFILT_WRITE && !s->ProcessWrite()) s->SetFlag(SF_DEAD); if (s->HasFlag(SF_DEAD)) |