]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/socketengine_kqueue.cpp
More stuff changed to const ref
[user/henk/code/inspircd.git] / src / socketengine_kqueue.cpp
index 14864da798a45bac62baead27f71d91e4107f1eb..ef5c507a1bf3543d4d8fb673af82f89550e75978 100644 (file)
  * ---------------------------------------------------
  */
 
-#include "inspircd_config.h"
-#include "globals.h"
 #include "inspircd.h"
 #include <sys/types.h>
 #include <sys/event.h>
 #include <sys/time.h>
-#include <vector>
-#include <string>
 #include "socketengine_kqueue.h"
 
 
@@ -48,6 +44,9 @@ KQueueEngine::~KQueueEngine()
 bool KQueueEngine::AddFd(EventHandler* eh)
 {
        int fd = eh->GetFd();
+
+       ServerInstance->Log(DEFAULT,"KQueueEngine::AddFd(%d)",fd);
+
        if ((fd < 0) || (fd > MAX_DESCRIPTORS))
        {
                ServerInstance->Log(DEFAULT,"ERROR: FD of %d added above max of %d",fd,MAX_DESCRIPTORS);
@@ -60,7 +59,10 @@ bool KQueueEngine::AddFd(EventHandler* eh)
        }
 
        if (ref[fd])
+       {
+               ServerInstance->Log(DEFAULT,"ERROR: Slot already occupied");
                return false;
+       }
 
        ref[fd] = eh;
        ServerInstance->Log(DEBUG,"Add socket %d",fd);
@@ -68,6 +70,7 @@ bool KQueueEngine::AddFd(EventHandler* eh)
        struct kevent ke;
        ServerInstance->Log(DEBUG,"kqueue: Add socket to events, kq=%d socket=%d",EngineHandle,fd);
        EV_SET(&ke, fd, eh->Readable() ? EVFILT_READ : EVFILT_WRITE, EV_ADD, 0, 0, NULL);
+
        int i = kevent(EngineHandle, &ke, 1, 0, 0, NULL);
        if (i == -1)
        {
@@ -90,15 +93,17 @@ bool KQueueEngine::DelFd(EventHandler* eh)
 
        struct kevent ke;
        EV_SET(&ke, fd, eh->Readable() ? EVFILT_READ : EVFILT_WRITE, EV_DELETE, 0, 0, NULL);
+
        int i = kevent(EngineHandle, &ke, 1, 0, 0, NULL);
        if (i == -1)
        {
-               ServerInstance->Log(DEBUG,"kqueue: Failed to remove socket from queue!");
+               ServerInstance->Log(DEBUG,"kqueue: Failed to remove socket from queue: %s",strerror(errno));
                return false;
        }
 
        CurrentSetSize--;
        ref[fd] = NULL;
+
        return true;
 }
 
@@ -112,17 +117,18 @@ int KQueueEngine::GetRemainingFds()
        return MAX_DESCRIPTORS - CurrentSetSize;
 }
 
-int KQueueEngine::Wait(EventHandler** fdlist)
+int KQueueEngine::DispatchEvents()
 {
-       int result = 0;
-
        ts.tv_nsec = 5000L;
        ts.tv_sec = 0;
        int i = kevent(EngineHandle, NULL, 0, &ke_list[0], MAX_DESCRIPTORS, &ts);
        for (int j = 0; j < i; j++)
-               fdlist[result++] = ref[ke_list[j].ident];
+       {
+               ServerInstance->Log(DEBUG,"Handle %s event on fd %d",ref[ke_list[j].ident]->Readable() ? "read" : "write", ref[ke_list[j].ident]->GetFd());
+               ref[ke_list[j].ident]->HandleEvent(ref[ke_list[j].ident]->Readable() ? EVENT_READ : EVENT_WRITE);
+       }
 
-       return result;
+       return i;
 }
 
 std::string KQueueEngine::GetName()