]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
Error set handlin g for select socketengine, tidyup epoll
authorbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>
Tue, 31 Oct 2006 20:43:47 +0000 (20:43 +0000)
committerbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>
Tue, 31 Oct 2006 20:43:47 +0000 (20:43 +0000)
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@5609 e03df62e-2008-0410-955e-edbf42e46eb7

include/socketengine_select.h
src/socketengine_epoll.cpp
src/socketengine_select.cpp

index 053ebc8c66f720859743dbe74a8f20186d6a7da8..847e044a117899cae208e4340993e081d602a685 100644 (file)
@@ -41,7 +41,7 @@ private:
        bool writeable[MAX_DESCRIPTORS];
        /** The read set and write set, populated before each call to select().
         */
-       fd_set wfdset, rfdset;
+       fd_set wfdset, rfdset, errfdset;
 public:
        /** Create a new SelectEngine
         * @param Instance The creator of this object
index 618f305929106a04716edb6b5aa03ed8b4a682d3..c1aab07d888664c886d3bcb8b41fa6e1ed4657b9 100644 (file)
@@ -138,6 +138,7 @@ int EPollEngine::DispatchEvents()
                ServerInstance->Log(DEBUG,"Handle %s event on fd %d",events[j].events & EPOLLOUT ? "write" : "read", events[j].data.fd);
                if (events[j].events & EPOLLHUP)
                {
+                       ServerInstance->Log(DEBUG,"Handle error event on fd %d", events[j].data.fd);
                        ref[events[j].data.fd]->HandleEvent(EVENT_ERROR, 0);
                        continue;
                }
@@ -146,6 +147,7 @@ int EPollEngine::DispatchEvents()
                        /* Get error number */
                        if (getsockopt(events[j].data.fd, SOL_SOCKET, SO_ERROR, &errcode, &codesize) < 0)
                                errcode = errno;
+                       ServerInstance->Log(DEBUG,"Handle error event on fd %d: %s", events[j].data.fd, strerror(errcode));
                        ref[events[j].data.fd]->HandleEvent(EVENT_ERROR, errcode);
                        continue;
                }
index cdd1bdc3cc95008fa1884344a0ba76519137efbc..a26c28e517d77e2c0badd8bbf507a602f6aef5d4 100644 (file)
@@ -103,6 +103,7 @@ int SelectEngine::DispatchEvents()
 
        FD_ZERO(&wfdset);
        FD_ZERO(&rfdset);
+       FD_ZERO(&errfdset);
 
        for (std::map<int,int>::iterator a = fds.begin(); a != fds.end(); a++)
        {
@@ -112,15 +113,17 @@ int SelectEngine::DispatchEvents()
                        FD_SET (a->second, &wfdset);
                if (writeable[a->second])
                        FD_SET (a->second, &wfdset);
+
+               FD_SET (a->second, &errfdset);
        }
        tval.tv_sec = 0;
        tval.tv_usec = 50L;
-       sresult = select(FD_SETSIZE, &rfdset, &wfdset, NULL, &tval);
+       sresult = select(FD_SETSIZE, &rfdset, &wfdset, &errfdset, &tval);
        if (sresult > 0)
        {
                for (std::map<int,int>::iterator a = fds.begin(); a != fds.end(); a++)
                {
-                       if ((FD_ISSET (a->second, &rfdset)) || (FD_ISSET (a->second, &wfdset)))
+                       if ((FD_ISSET (a->second, &rfdset)) || (FD_ISSET (a->second, &wfdset)) || FD_ISSET (a->second, &errfdset))
                        {
                                ev[result++] = ref[a->second];
                        }
@@ -136,6 +139,12 @@ int SelectEngine::DispatchEvents()
        {
                if (ev[i])
                {
+                       if (FD_ISSET (a->second, &errfdset))
+                       {
+                               if (ev[i])
+                                       ev[i]->HandleEvent(EVENT_ERROR, 0);
+                               continue;
+                       }
                        ServerInstance->Log(DEBUG,"Handle %s event on fd %d",writeable[ev[i]->GetFd()] || !ev[i]->Readable() ? "write" : "read", ev[i]->GetFd());
                        if (writeable[ev[i]->GetFd()])
                        {