summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
d5411d0)
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@11687
e03df62e-2008-0410-955e-
edbf42e46eb7
private:
/** Because select() does not track an fd list for us between calls, we have one of our own
*/
private:
/** Because select() does not track an fd list for us between calls, we have one of our own
*/
/** List of writeable ones (WantWrite())
*/
/** List of writeable ones (WantWrite())
*/
+ std::vector<bool> writeable;
/** The read set and write set, populated before each call to select().
*/
fd_set wfdset, rfdset, errfdset;
/** The read set and write set, populated before each call to select().
*/
fd_set wfdset, rfdset, errfdset;
EngineHandle = 0;
CurrentSetSize = 0;
EngineHandle = 0;
CurrentSetSize = 0;
- writeable = new bool [GetMaxFds()];
- memset(writeable, 0, sizeof(writeable));
+ writeable.assign(GetMaxFds(), false);
ref = new EventHandler* [GetMaxFds()];
memset(ref, 0, GetMaxFds() * sizeof(EventHandler*));
}
ref = new EventHandler* [GetMaxFds()];
memset(ref, 0, GetMaxFds() * sizeof(EventHandler*));
}
if (ref[fd])
return false;
if (ref[fd])
return false;
ref[fd] = eh;
CurrentSetSize++;
ref[fd] = eh;
CurrentSetSize++;
if ((fd < 0) || (fd > GetMaxFds() - 1))
return false;
if ((fd < 0) || (fd > GetMaxFds() - 1))
return false;
- std::map<int,int>::iterator t = fds.find(fd);
+ std::set<int>::iterator t = fds.find(fd);
if (t != fds.end())
fds.erase(t);
if (t != fds.end())
fds.erase(t);
FD_ZERO(&errfdset);
/* Populate the select FD set (this is why select sucks compared to epoll, kqueue, IOCP) */
FD_ZERO(&errfdset);
/* Populate the select FD set (this is why select sucks compared to epoll, kqueue, IOCP) */
- for (std::map<int,int>::iterator a = fds.begin(); a != fds.end(); a++)
+ for (std::set<int>::iterator a = fds.begin(); a != fds.end(); a++)
- if (ref[a->second]->Readable())
+ if (ref[*a]->Readable())
- FD_SET (a->second, &rfdset);
else
/* Write notifications */
else
/* Write notifications */
- FD_SET (a->second, &wfdset);
/* Explicitly one-time writeable */
/* Explicitly one-time writeable */
- if (writeable[a->second])
- FD_SET (a->second, &wfdset);
+ if (writeable[*a])
+ FD_SET (*a, &wfdset);
/* All sockets must receive error notifications regardless */
/* All sockets must receive error notifications regardless */
- FD_SET (a->second, &errfdset);
+ FD_SET (*a, &errfdset);
if (sresult < 1)
return 0;
if (sresult < 1)
return 0;
- /* Safe assumption (as of 1.1 anyway) that a socket can't remove itself from the list in the middle of the loop */
- for (std::map<int,int>::iterator a = fds.begin(); a != fds.end(); a++)
+ std::vector<int> copy(fds.begin(), fds.end());
+ for (std::vector<int>::iterator a = copy.begin(); a != copy.end(); a++)
- EventHandler* ev = ref[a->second];
+ EventHandler* ev = ref[*a];
if (ev)
{
if (FD_ISSET (ev->GetFd(), &errfdset))
if (ev)
{
if (FD_ISSET (ev->GetFd(), &errfdset))