]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/socketengine.cpp
EXPERIMENTAL new socket engine code
[user/henk/code/inspircd.git] / src / socketengine.cpp
index d6255e9e3f4f01441cf288a7c9e68157352834da..0c816943e519267173cf6521031824c1389a26cc 100644 (file)
@@ -1,3 +1,6 @@
+#include "inspircd_config.h"
+#include "globals.h"
+#include "inspircd.h"
 #ifdef USE_EPOLL
 #include <sys/epoll.h>
 #define EP_DELAY 5
 #include <sys/event.h>
 #include <sys/time.h>
 #endif
-
+#include <vector>
+#include <string>
+#include "socketengine.h"
 
 char ref[65535];
 
-const char X_LISTEN            = 0;
-const char X_ESTAB_CLIENT      = 1;
-const char X_ESTAB_MODULE      = 2;
-const char X_ESTAB_DNS         = 3;
-
-const char X_READBIT           = 0x80;
-
 SocketEngine::SocketEngine()
 {
+       log(DEBUG,"SocketEngine::SocketEngine()");
 #ifdef USE_EPOLL
        EngineHandle = epoll_create(65535);
 #endif
@@ -30,7 +29,11 @@ SocketEngine::SocketEngine()
 
 SocketEngine::~SocketEngine()
 {
-#ifdef USE_EPOLL || USE_KQUEUE
+       log(DEBUG,"SocketEngine::~SocketEngine()");
+#ifdef USE_EPOLL
+       close(EngineHandle);
+#endif
+#ifdef USE_KQUEUE
        close(EngineHandle);
 #endif
 }
@@ -42,7 +45,7 @@ bool SocketEngine::AddFd(int fd, bool readable, char type)
                ref[fd] |= X_READBIT;
 #ifdef USE_EPOLL
        struct epoll_event ev;
-       log(DEBUG,"epoll: Adduser to events, ep=%d socket=%d",EngineHandle,fd);
+       log(DEBUG,"epoll: Add socket to events, ep=%d socket=%d",EngineHandle,fd);
        readable ? ev.events = EPOLLIN | EPOLLET : ev.events = EPOLLOUT | EPOLLET;
        ev.data.fd = fd;
        int i = epoll_ctl(EngineHandle, EPOLL_CTL_ADD, fd, &ev);
@@ -54,8 +57,8 @@ bool SocketEngine::AddFd(int fd, bool readable, char type)
 #endif
 #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);
+       log(DEBUG,"kqueue: Add socket to events, kq=%d socket=%d",EngineHandle,fd);
+       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)
        {
@@ -68,16 +71,24 @@ 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);
+       log(DEBUG,"SocketEngine::DelFd(%d)",fd);
+       bool found = false;
+       for (std::vector<int>::iterator i = fds.begin(); i != fds.end(); i++)
+       {
+               if (*i == fd)
+               {
+                       fds.erase(i);
+                       found = true;
+                       break;
+               }
+       }
 #ifdef USE_KQUEUE
        struct kevent ke;
        EV_SET(&ke, fd, ref[fd] && X_READBIT ? EVFILT_READ : EVFILT_WRITE, EV_DELETE, 0, 0, NULL);
        int i = kevent(EngineHandle, &ke, 1, 0, 0, NULL);
        if (i == -1)
        {
-               log(DEBUG,"kqueue: Failed to remove user from queue!");
+               log(DEBUG,"kqueue: Failed to remove socket from queue!");
                return false;
        }
 #endif
@@ -93,14 +104,15 @@ 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
-       int highest_fd = 0;
+       FD_ZERO(&wfdset);
+       FD_ZERO(&rfdset);
        timeval tval;
        int sresult;
        for (unsigned int a = 0; a < fds.size(); a++)
@@ -130,14 +142,14 @@ 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
 #ifdef USE_EPOLL
        int i = epoll_wait(EngineHandle, events, 65535, 1);
        for (int j = 0; j < i; j++)
-               fdlist.push_back(event[0].data.fd);
+               fdlist.push_back(events[j].data.fd);
 #endif
        return true;
 }