summaryrefslogtreecommitdiff
path: root/src/socketengine_select.cpp
diff options
context:
space:
mode:
authorbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2006-07-19 12:51:21 +0000
committerbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2006-07-19 12:51:21 +0000
commit3a6885d6a1d30f6e2eb9b1fcd20e949768267318 (patch)
treefefc6fb26bf91713479e47261775651c927b1441 /src/socketengine_select.cpp
parente8c920ce01a47e7b05ca3d445c3d8d88f9c70e37 (diff)
* Seperate out socket engines into derived classes of SocketEngine.
* Add a classfactory SocketEngineFactory to create a new socketengine of the configured type * Implement configure hax to compile only the required socketengine and the base class * Eliminates ugly defines, and is more in line with C++ ways git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@4439 e03df62e-2008-0410-955e-edbf42e46eb7
Diffstat (limited to 'src/socketengine_select.cpp')
-rw-r--r--src/socketengine_select.cpp131
1 files changed, 131 insertions, 0 deletions
diff --git a/src/socketengine_select.cpp b/src/socketengine_select.cpp
new file mode 100644
index 000000000..8d77da461
--- /dev/null
+++ b/src/socketengine_select.cpp
@@ -0,0 +1,131 @@
+/* +------------------------------------+
+ * | Inspire Internet Relay Chat Daemon |
+ * +------------------------------------+
+ *
+ * InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev.
+ * E-mail:
+ * <brain@chatspike.net>
+ * <Craig@chatspike.net>
+ *
+ * Written by Craig Edwards, Craig McLure, and others.
+ * This program is free but copyrighted software; see
+ * the file COPYING for details.
+ *
+ * ---------------------------------------------------
+ */
+
+#include "inspircd_config.h"
+#include "globals.h"
+#include "inspircd.h"
+#include <vector>
+#include <string>
+#include "socketengine_select.h"
+#include "helperfuncs.h"
+
+SelectEngine::SelectEngine()
+{
+ log(DEBUG,"SelectEngine::SelectEngine()");
+ EngineHandle = 0;
+ CurrentSetSize = 0;
+}
+
+SelectEngine::~SelectEngine()
+{
+ log(DEBUG,"SelectEngine::~SelectEngine()");
+}
+
+bool SelectEngine::AddFd(int fd, bool readable, char type)
+{
+ if ((fd < 0) || (fd > MAX_DESCRIPTORS))
+ {
+ log(DEFAULT,"ERROR: FD of %d added above max of %d",fd,MAX_DESCRIPTORS);
+ return false;
+ }
+ if (GetRemainingFds() <= 1)
+ {
+ log(DEFAULT,"ERROR: System out of file descriptors!");
+ return false;
+ }
+
+ fds[fd] = fd;
+
+ ref[fd] = type;
+ if (readable)
+ {
+ log(DEBUG,"Set readbit");
+ ref[fd] |= X_READBIT;
+ }
+ log(DEBUG,"Add socket %d",fd);
+
+ CurrentSetSize++;
+ return true;
+}
+
+bool SelectEngine::DelFd(int fd)
+{
+ log(DEBUG,"SelectEngine::DelFd(%d)",fd);
+
+ if ((fd < 0) || (fd > MAX_DESCRIPTORS))
+ return false;
+
+ std::map<int,int>::iterator t = fds.find(fd);
+ if (t != fds.end())
+ {
+ fds.erase(t);
+ log(DEBUG,"Deleted fd %d",fd);
+ }
+
+ CurrentSetSize--;
+ ref[fd] = 0;
+ return true;
+}
+
+int SelectEngine::GetMaxFds()
+{
+ return FD_SETSIZE;
+}
+
+int SelectEngine::GetRemainingFds()
+{
+ return FD_SETSIZE - CurrentSetSize;
+}
+
+int SelectEngine::Wait(int* fdlist)
+{
+ int result = 0;
+
+ FD_ZERO(&wfdset);
+ FD_ZERO(&rfdset);
+ timeval tval;
+ int sresult;
+ for (std::map<int,int>::iterator a = fds.begin(); a != fds.end(); a++)
+ {
+ if (ref[a->second] & X_READBIT)
+ {
+ FD_SET (a->second, &rfdset);
+ }
+ else
+ {
+ FD_SET (a->second, &wfdset);
+ }
+
+ }
+ tval.tv_sec = 0;
+ tval.tv_usec = 50L;
+ sresult = select(FD_SETSIZE, &rfdset, &wfdset, NULL, &tval);
+ if (sresult > 0)
+ {
+ for (std::map<int,int>::iterator a = fds.begin(); a != fds.end(); a++)
+ {
+ if ((FD_ISSET (a->second, &rfdset)) || (FD_ISSET (a->second, &wfdset)))
+ fdlist[result++] = a->second;
+ }
+ }
+
+ return result;
+}
+
+std::string SelectEngine::GetName()
+{
+ return "select";
+}