diff options
-rw-r--r-- | include/socketengine.h | 16 | ||||
-rw-r--r-- | src/socketengine.cpp | 28 |
2 files changed, 34 insertions, 10 deletions
diff --git a/include/socketengine.h b/include/socketengine.h index 967c0967b..41cd459d8 100644 --- a/include/socketengine.h +++ b/include/socketengine.h @@ -19,6 +19,18 @@ #include <vector> #include <string> +#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 class SocketEngine { @@ -39,9 +51,9 @@ public: SocketEngine(); ~SocketEngine(); - bool AddFd(int fd, bool readable, bool writeable, char type); + bool AddFd(int fd, bool readable, char type); bool DelFd(int fd); - bool Wait(unsigned long millisecs, std::vector<int> &fdlist); + bool Wait(std::vector<int> &fdlist); std::string GetName(); }; diff --git a/src/socketengine.cpp b/src/socketengine.cpp index 16f303b3d..f99a5d073 100644 --- a/src/socketengine.cpp +++ b/src/socketengine.cpp @@ -10,6 +10,9 @@ #include <sys/event.h> #include <sys/time.h> #endif +#include <vector> +#include <string> +#include "socketengine.h" char ref[65535]; @@ -32,7 +35,10 @@ SocketEngine::SocketEngine() SocketEngine::~SocketEngine() { -#ifdef USE_EPOLL || USE_KQUEUE +#ifdef USE_EPOLL + close(EngineHandle); +#endif +#ifdef USE_KQUEUE close(EngineHandle); #endif } @@ -57,7 +63,7 @@ bool SocketEngine::AddFd(int fd, bool readable, char type) #ifdef USE_KQUEUE struct kevent ke; log(DEBUG,"kqueue: Add user to events, kq=%d socket=%d",EngineHandle,fd); - EV_SET(&ke, socket, readable ? EVFILT_READ : EVFILT_WRITE, EV_ADD, 0, 0, NULL); + EV_SET(&ke, fd, readable ? EVFILT_READ : EVFILT_WRITE, EV_ADD, 0, 0, NULL); int i = kevent(EngineHandle, &ke, 1, 0, 0, NULL); if (i == -1) { @@ -70,9 +76,15 @@ return true; bool SocketEngine::DelFd(int fd) { - std::vector<int>::iterator i = this->fds.find(fd); - if (i != this->fds.end()) - this->fds.erase(i); + bool found = false; + for (std::vector<int>::iterator i = fds.begin(); i != fds.end(); i++) + { + if (*i == fd) + { + fds.erase(i); + found = true; + } + } #ifdef USE_KQUEUE struct kevent ke; EV_SET(&ke, fd, ref[fd] && X_READBIT ? EVFILT_READ : EVFILT_WRITE, EV_DELETE, 0, 0, NULL); @@ -95,10 +107,10 @@ bool SocketEngine::DelFd(int fd) } #endif ref[fd] = 0; - return (i != this->fds.end()); + return found; } -bool SocketEngine::Wait(unsigned long millisecs, std::vector<int> &fdlist) +bool SocketEngine::Wait(std::vector<int> &fdlist) { fdlist.clear(); #ifdef USE_SELECT @@ -132,7 +144,7 @@ bool SocketEngine::Wait(unsigned long millisecs, std::vector<int> &fdlist) #ifdef USE_KQUEUE ts.tv_nsec = 1000L; ts.tv_sec = 0; - int i = kevent(EngineHandle, NULL, 0, &ke_list, 65535, &ts); + int i = kevent(EngineHandle, NULL, 0, &ke_list[0], 65535, &ts); for (int j = 0; j < i; j++) fdlist.push_back(ke_list[j].ident); #endif |