Make the socketengines always clear the slots on DelFd, even if the underlying queue call fails

git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@5437 e03df62e-2008-0410-955e-edbf42e46eb7
This commit is contained in:
brain 2006-10-06 19:59:09 +00:00
parent 5b3a9f2af8
commit 457e12e541
2 changed files with 9 additions and 4 deletions

View File

@ -90,14 +90,16 @@ bool EPollEngine::DelFd(EventHandler* eh)
eh->Readable() ? ev.events = EPOLLIN : ev.events = EPOLLOUT;
ev.data.fd = fd;
int i = epoll_ctl(EngineHandle, EPOLL_CTL_DEL, fd, &ev);
CurrentSetSize--;
ref[fd] = NULL;
if (i < 0)
{
ServerInstance->Log(DEBUG,"epoll: List deletion failure: %s",strerror(errno));
return false;
}
CurrentSetSize--;
ref[fd] = NULL;
return true;
}

View File

@ -70,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)
{
@ -92,6 +93,10 @@ bool KQueueEngine::DelFd(EventHandler* eh)
struct kevent ke;
EV_SET(&ke, fd, eh->Readable() ? EVFILT_READ : EVFILT_WRITE, EV_DELETE, 0, 0, NULL);
CurrentSetSize--;
ref[fd] = NULL;
int i = kevent(EngineHandle, &ke, 1, 0, 0, NULL);
if (i == -1)
{
@ -99,8 +104,6 @@ bool KQueueEngine::DelFd(EventHandler* eh)
return false;
}
CurrentSetSize--;
ref[fd] = NULL;
return true;
}