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