]> jfr.im git - irc/rqf/shadowircd.git/blobdiff - libcharybdis/epoll.c
Remove silly a2client_p, entirely pointless since User.server removal.
[irc/rqf/shadowircd.git] / libcharybdis / epoll.c
index fd005b3ed1e2d258292a0ad46b39e9e12f3551d1..f06ced33b06fe8c60ae4a87b7d2bbd108bb00130 100644 (file)
@@ -180,8 +180,25 @@ comm_select(unsigned long delay)
                }
 
 
-               if(F->flags.open == 0)
+               if(F->flags.open == 0 && F->pflags == 0)
+                       continue;
+               else if (F->flags.open == 0)
+               {
+                       F->pflags = ep_event.events = flags;
+                       ep_event.data.ptr = F;
+
+                       if(epoll_ctl(ep, EPOLL_CTL_DEL, F->fd, &ep_event) != 0) {
+                               /* XXX: we assume this is because close(2) has been called here. */
+                               if (errno == EBADF)
+                                       continue;
+
+                               libcharybdis_log("comm_select(): epoll_ctl failed while trying to delete an FD marked as closed: %s", strerror(errno));
+                               abort();
+                       }
+
                        continue;
+               }
+
                if(pfd[i].events & (EPOLLOUT | EPOLLHUP | EPOLLERR))
                {
                        hdl = F->write_handler;
@@ -204,9 +221,15 @@ comm_select(unsigned long delay)
                        ep_event.data.ptr = F;
 
                        if(epoll_ctl(ep, EPOLL_CTL_DEL, F->fd, &ep_event) != 0) {
-                               libcharybdis_log("comm_select(): epoll_ctl failed while trying to delete a closed FD: %s", strerror(errno));
+                               /* XXX: we assume this is because close(2) has been called here. */
+                               if (errno == EBADF)
+                                       continue;
+
+                               libcharybdis_log("comm_select(): epoll_ctl failed while trying to delete an FD marked as closed: %s", strerror(errno));
                                abort();
                        }
+
+                       continue;
                }
                
                flags = 0;
@@ -238,4 +261,3 @@ comm_select(unsigned long delay)
        }
        return COMM_OK;
 }
-