]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - include/socketengine.h
Extra checking that the fd's we pass to SocketEngine::AddFd were added (a lot of...
[user/henk/code/inspircd.git] / include / socketengine.h
index bbd34a30288b2403ba5a5c7700c59fabd7296c80..a788618a27a47ceb6a5d6f6c2018c40396ccb26d 100644 (file)
 #include "inspircd_config.h"
 #include "globals.h"
 #include "inspircd.h"
-#ifdef USE_EPOLL
-#include <sys/epoll.h>
-#define EP_DELAY 5
-#endif
-#ifdef USE_KQUEUE
-#include <sys/types.h>
-#include <sys/event.h>
-#include <sys/time.h>
-#endif
 
 /**
  * Each of these values represents a socket
@@ -49,7 +40,7 @@ const char X_ESTAB_DNS          = 4;
  * To indicate that a socket is readable, we
  * mask its top bit with this X_READBIT value.
  * The socket engine can handle two types of
- * socket, readable and writeable (error sockets
+ * socket, readable and writeable (;error sockets
  * are dealt with when read() and write() return
  * negative or zero values).
  */
@@ -63,24 +54,22 @@ const char X_READBIT            = 0x80;
  * from system to system and upon the config
  * settings chosen by the server admin. The current
  * version supports select, epoll and kqueue.
+ * The configure script will enable a socket engine
+ * based upon what OS is detected, and will derive
+ * a class from SocketEngine based upon what it finds.
+ * The derived classes file will also implement a
+ * classfactory, SocketEngineFactory, which will
+ * create a derived instance of SocketEngine using
+ * polymorphism so that the core and modules do not
+ * have to be aware of which SocketEngine derived
+ * class they are using.
  */
 class SocketEngine : public Extensible
 {
-
+protected:
        int EngineHandle;                       /* Handle to the socket engine if needed */
        int CurrentSetSize;                     /* Current number of descriptors in the engine */
-#ifdef USE_SELECT
-       std::map<int,int> fds;                  /* List of file descriptors being monitored */
-       fd_set wfdset, rfdset;                  /* Readable and writeable sets for select() */
-#endif
-#ifdef USE_KQUEUE
-       struct kevent ke_list[MAX_DESCRIPTORS]; /* Up to 64k sockets for kqueue */
-       struct timespec ts;                     /* kqueue delay value */
-#endif
-#ifdef USE_EPOLL
-       struct epoll_event events[MAX_DESCRIPTORS];     /* Up to 64k sockets for epoll */
-#endif
-
+       char ref[MAX_DESCRIPTORS];              /* Reference table */
 public:
 
        /** Constructor
@@ -97,7 +86,7 @@ public:
         * The destructor transparently tidies up
         * any resources used by the socket engine.
         */
-       ~SocketEngine();
+       virtual ~SocketEngine();
 
        /** Add a file descriptor to the engine
         * Use AddFd to add a file descriptor to the
@@ -108,7 +97,7 @@ public:
         * or write events (there is currently no
         * need for support of both).
         */
-       bool AddFd(int fd, bool readable, char type);
+       virtual bool AddFd(int fd, bool readable, char type);
 
        /** Returns the type value for this file descriptor
         * This function masks off the X_READBIT value
@@ -125,19 +114,19 @@ public:
        /** Returns the maximum number of file descriptors
         * you may store in the socket engine at any one time.
         */
-       int GetMaxFds();
+       virtual int GetMaxFds();
 
        /** Returns the number of file descriptor slots
         * which are available for storing fds.
         */
-       int GetRemainingFds();
+       virtual int GetRemainingFds();
 
        /** Delete a file descriptor from the engine
         * This function call deletes a file descriptor
         * from the engine, returning true if it succeeded
         * and false if it failed.
         */
-       bool DelFd(int fd);
+       virtual bool DelFd(int fd);
 
        /** Returns true if a socket exists in the socket
         * engine's list.
@@ -150,13 +139,13 @@ public:
         * of active file descriptors in the vector
         * fdlist which the core may then act upon.
         */
-       int Wait(int* fdlist);
+       virtual int Wait(int* fdlist);
 
        /** Returns the socket engines name
         * This returns the name of the engine for use
         * in /VERSION responses.
         */
-       std::string GetName();
+       virtual std::string GetName();
 };
 
 #endif