#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
* 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).
*/
* 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
* 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
* 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
/** 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.
* 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