]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/socketengine_select.cpp
Take some debug crap out of ModeParser::ModeString()
[user/henk/code/inspircd.git] / src / socketengine_select.cpp
index 4e79dc19ba28b089817ab7ac5bbada0e0e63b136..04f49bac5a52edc5a96789110df5eb95bb027278 100644 (file)
  * ---------------------------------------------------
  */
 
-#include "inspircd_config.h"
-#include "globals.h"
 #include "inspircd.h"
-#include <vector>
-#include <string>
 #include <sys/select.h>
 #include "socketengine_select.h"
 
@@ -35,8 +31,9 @@ SelectEngine::~SelectEngine()
        ServerInstance->Log(DEBUG,"SelectEngine::~SelectEngine()");
 }
 
-bool SelectEngine::AddFd(int fd, bool readable, char type)
+bool SelectEngine::AddFd(EventHandler* eh)
 {
+       int fd = eh->GetFd();
        if ((fd < 0) || (fd > MAX_DESCRIPTORS))
        {
                ServerInstance->Log(DEFAULT,"ERROR: FD of %d added above max of %d",fd,MAX_DESCRIPTORS);
@@ -53,20 +50,17 @@ bool SelectEngine::AddFd(int fd, bool readable, char type)
        if (ref[fd])
                return false;
 
-       ref[fd] = type;
-       if (readable)
-       {
-               ServerInstance->Log(DEBUG,"Set readbit");
-               ref[fd] |= X_READBIT;
-       }
+       ref[fd] = eh;
        ServerInstance->Log(DEBUG,"Add socket %d",fd);
 
        CurrentSetSize++;
        return true;
 }
 
-bool SelectEngine::DelFd(int fd)
+bool SelectEngine::DelFd(EventHandler* eh)
 {
+       int fd = eh->GetFd();
+
        ServerInstance->Log(DEBUG,"SelectEngine::DelFd(%d)",fd);
 
        if ((fd < 0) || (fd > MAX_DESCRIPTORS))
@@ -80,7 +74,7 @@ bool SelectEngine::DelFd(int fd)
        }
 
        CurrentSetSize--;
-       ref[fd] = 0;
+       ref[fd] = NULL;
        return true;
 }
 
@@ -94,17 +88,19 @@ int SelectEngine::GetRemainingFds()
        return FD_SETSIZE - CurrentSetSize;
 }
 
-int SelectEngine::Wait(int* fdlist)
+int SelectEngine::DispatchEvents()
 {
        int result = 0;
+       timeval tval;
+       int sresult = 0;
+       EventHandler* ev[MAX_DESCRIPTOR];
 
        FD_ZERO(&wfdset);
        FD_ZERO(&rfdset);
-       timeval tval;
-       int sresult;
+
        for (std::map<int,int>::iterator a = fds.begin(); a != fds.end(); a++)
        {
-               if (ref[a->second] & X_READBIT)
+               if (ref[a->second]->Readable())
                {
                        FD_SET (a->second, &rfdset);
                }
@@ -122,10 +118,23 @@ int SelectEngine::Wait(int* fdlist)
                for (std::map<int,int>::iterator a = fds.begin(); a != fds.end(); a++)
                {
                        if ((FD_ISSET (a->second, &rfdset)) || (FD_ISSET (a->second, &wfdset)))
-                               fdlist[result++] = a->second;
+                       {
+                               ev[result++] = ref[a->second];
+                       }
                }
        }
 
+       /** An event handler may remove its own descriptor from the list, therefore it is not
+        * safe to directly iterate over the list and dispatch events there with STL iterators.
+        * Thats a shame because it makes this code slower and more resource intensive, but maybe
+        * the user should stop using select(), as select() smells anyway.
+        */
+       for (int i = 0; i < result; i++)
+       {
+               ServerInstance->Log(DEBUG,"Handle %s event on fd %d",ev[i]->Readable() ? "read" : "write", ev[i]->GetFd());
+               ev[i]->HandleEvent(ev[i]->Readable() ? EVENT_READ : EVENT_WRITE);
+       }
+
        return result;
 }