X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fsocketengines%2Fsocketengine_select.cpp;h=8c41df11b745bc5e585a4270d5875d07aae6569f;hb=c11ec1cd3867fc6759fadb8143df676406b3e3e7;hp=48d2bbf81c982ae1dcc95a53c8ca3ed10e0c9dd9;hpb=d5411d06255ea264791631538642619d13e129aa;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/socketengines/socketengine_select.cpp b/src/socketengines/socketengine_select.cpp index 48d2bbf81..8c41df11b 100644 --- a/src/socketengines/socketengine_select.cpp +++ b/src/socketengines/socketengine_select.cpp @@ -24,8 +24,7 @@ SelectEngine::SelectEngine(InspIRCd* Instance) : SocketEngine(Instance) 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*)); } @@ -47,7 +46,7 @@ bool SelectEngine::AddFd(EventHandler* eh) if (ref[fd]) return false; - fds[fd] = fd; + fds.insert(fd); ref[fd] = eh; CurrentSetSize++; @@ -67,7 +66,7 @@ bool SelectEngine::DelFd(EventHandler* eh, bool force) if ((fd < 0) || (fd > GetMaxFds() - 1)) return false; - std::map::iterator t = fds.find(fd); + std::set::iterator t = fds.find(fd); if (t != fds.end()) fds.erase(t); @@ -100,21 +99,21 @@ int SelectEngine::DispatchEvents() FD_ZERO(&errfdset); /* Populate the select FD set (this is why select sucks compared to epoll, kqueue, IOCP) */ - for (std::map::iterator a = fds.begin(); a != fds.end(); a++) + for (std::set::iterator a = fds.begin(); a != fds.end(); a++) { - if (ref[a->second]->Readable()) + if (ref[*a]->Readable()) /* Read notifications */ - FD_SET (a->second, &rfdset); + FD_SET (*a, &rfdset); else /* Write notifications */ - FD_SET (a->second, &wfdset); + FD_SET (*a, &wfdset); /* 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 */ - FD_SET (a->second, &errfdset); + FD_SET (*a, &errfdset); } /* One second waits */ @@ -127,10 +126,10 @@ int SelectEngine::DispatchEvents() 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::iterator a = fds.begin(); a != fds.end(); a++) + std::vector copy(fds.begin(), fds.end()); + for (std::vector::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))