Mercurial > code
changeset 371:166943bde655
Socket: update kqueue method
author | David Demelier <markand@malikania.fr> |
---|---|
date | Wed, 29 Apr 2015 17:26:55 +0200 |
parents | 2c6a4f468499 |
children | d6e95a577fe9 |
files | C++/modules/Socket/SocketListener.cpp C++/modules/Socket/SocketListener.h |
diffstat | 2 files changed, 14 insertions(+), 63 deletions(-) [+] |
line wrap: on
line diff
--- a/C++/modules/Socket/SocketListener.cpp Wed Apr 29 17:17:35 2015 +0200 +++ b/C++/modules/Socket/SocketListener.cpp Wed Apr 29 17:26:55 2015 +0200 @@ -308,7 +308,7 @@ close(m_handle); } -void Kqueue::update(Socket &sc, int filter, int flags) +void Kqueue::update(const Socket &sc, int filter, int flags) { struct kevent ev; @@ -319,28 +319,21 @@ } } -void Kqueue::set(Socket sc, int flags) +void Kqueue::set(const SocketTable &, const Socket &sc, int flags, bool add) { if (flags & SocketListener::Read) { - puts("About to set to add"); update(sc, EVFILT_READ, EV_ADD | EV_ENABLE); } if (flags & SocketListener::Write) { - puts("About to set to remove"); update(sc, EVFILT_WRITE, EV_ADD | EV_ENABLE); } - auto it = m_table.find(sc.handle()); - if (it == m_table.end()) { - m_table.emplace(sc.handle(), std::make_pair(std::move(sc), flags)); - } else { - it->second.second |= flags; + if (add) { + m_result.resize(m_result.size() + 1); } - - m_result.resize(m_table.size()); } -void Kqueue::unset(Socket sc, int flags) +void Kqueue::unset(const SocketTable &, const Socket &sc, int flags, bool remove) { if (flags & SocketListener::Read) { update(sc, EVFILT_READ, EV_DELETE); @@ -349,53 +342,12 @@ update(sc, EVFILT_WRITE, EV_DELETE); } - auto it = m_table.find(sc.handle()); - if (it != m_table.end()) { - it->second.second &= ~(flags); - - if (it->second.second == 0) { - m_table.erase(it); - } + if (remove) { + m_result.resize(m_result.size() - 1); } - - m_result.resize(m_table.size()); } -void Kqueue::remove(Socket sc) -{ - auto it = m_table.find(sc.handle()); - - if (it != m_table.end()) { - if (it->second.second & SocketListener::Read) { - update(sc, EVFILT_READ, EV_DELETE); - } - if (it->second.second & SocketListener::Write) { - update(sc, EVFILT_WRITE, EV_DELETE); - } - - m_table.erase(sc.handle()); - } - - m_result.resize(m_table.size()); -} - -void Kqueue::clear() -{ - for (auto &pair : m_table) { - update(pair.second.first, EVFILT_READ, EV_DELETE); - update(pair.second.first, EVFILT_WRITE, EV_DELETE); - } - - m_table.clear(); - m_result.resize(0U); -} - -SocketStatus Kqueue::wait(int ms) -{ - return waitMultiple(ms)[0]; -} - -std::vector<SocketStatus> Kqueue::waitMultiple(int ms) +std::vector<SocketStatus> Kqueue::wait(const SocketTable &table, int ms) { std::vector<SocketStatus> sockets; timespec ts = { 0, 0 }; @@ -414,7 +366,7 @@ } for (int i = 0; i < nevents; ++i) { - Socket sc = m_table.at(m_result[i].ident).first; + Socket sc = table.at(m_result[i].ident).first; int flags = m_result[i].filter == EVFILT_READ ? SocketListener::Read : SocketListener::Write; sockets.push_back(SocketStatus{sc, flags});
--- a/C++/modules/Socket/SocketListener.h Wed Apr 29 17:17:35 2015 +0200 +++ b/C++/modules/Socket/SocketListener.h Wed Apr 29 17:26:55 2015 +0200 @@ -77,7 +77,7 @@ # include <sys/event.h> # include <sys/time.h> -# define SOCKET_DEFAULT_BACKEND backend::Select +# define SOCKET_DEFAULT_BACKEND backend::Kqueue #else # define SOCKET_DEFAULT_BACKEND backend::Select #endif @@ -224,16 +224,15 @@ Kqueue(Kqueue &&) = delete; Kqueue &operator=(Kqueue &&) = delete; - void update(Socket &sc, int filter, int flags); + void update(const Socket &sc, int filter, int flags); public: Kqueue(); ~Kqueue(); - void set(Socket sc, int flags, bool add); - void unset(Socket sc, int flags, bool remove); - SocketStatus wait(int ms); - std::vector<SocketStatus> waitMultiple(int ms); + void set(const SocketTable &, const Socket &sc, int flags, bool add); + void unset(const SocketTable &, const Socket &sc, int flags, bool remove); + std::vector<SocketStatus> wait(const SocketTable &, int ms); /** * Backend identifier