diff --git a/src/PortEventPoll.cc b/src/PortEventPoll.cc index b95fc44b..f0df0e1e 100644 --- a/src/PortEventPoll.cc +++ b/src/PortEventPoll.cc @@ -139,9 +139,8 @@ void PortEventPoll::poll(const struct timeval& tv) // own timeout and ares may create new sockets or closes socket in // their API. So we call ares_process_fd for all ares_channel and // re-register their sockets. - for(std::deque >::iterator i = - nameResolverEntries_.begin(), eoi = nameResolverEntries_.end(); - i != eoi; ++i) { + for(KAsyncNameResolverEntrySet::iterator i = nameResolverEntries_.begin(), + eoi = nameResolverEntries_.end(); i != eoi; ++i) { (*i)->processTimeout(); (*i)->removeSocketEvents(this); (*i)->addSocketEvents(this); @@ -176,9 +175,7 @@ bool PortEventPoll::addEvents(sock_t socket, const PortEventPoll::KEvent& event) { SharedHandle socketEntry(new KSocketEntry(socket)); - std::deque >::iterator i = - std::lower_bound(socketEntries_.begin(), socketEntries_.end(), socketEntry, - DerefLess >()); + KSocketEntrySet::iterator i = socketEntries_.lower_bound(socketEntry); int r = 0; int errNum = 0; if(i != socketEntries_.end() && *(*i) == *socketEntry) { @@ -228,10 +225,11 @@ bool PortEventPoll::deleteEvents(sock_t socket, const PortEventPoll::KEvent& event) { SharedHandle socketEntry(new KSocketEntry(socket)); - std::deque >::iterator i = - std::lower_bound(socketEntries_.begin(), socketEntries_.end(), socketEntry, - DerefLess >()); - if(i != socketEntries_.end() && *(*i) == *socketEntry) { + KSocketEntrySet::iterator i = socketEntries_.find(socketEntry); + if(i == socketEntries_.end()) { + A2_LOG_DEBUG(fmt("Socket %d is not found in SocketEntries.", socket)); + return false; + } else { event.removeSelf(*i); int r = 0; int errNum = 0; @@ -252,9 +250,6 @@ bool PortEventPoll::deleteEvents(sock_t socket, } else { return true; } - } else { - A2_LOG_DEBUG(fmt("Socket %d is not found in SocketEntries.", socket)); - return false; } } @@ -279,11 +274,9 @@ bool PortEventPoll::addNameResolver { SharedHandle entry (new KAsyncNameResolverEntry(resolver, command)); - std::deque >::iterator itr = - std::find_if(nameResolverEntries_.begin(), nameResolverEntries_.end(), - derefEqual(entry)); + KAsyncNameResolverEntrySet::iterator itr = nameResolverEntries_.find(entry); if(itr == nameResolverEntries_.end()) { - nameResolverEntries_.push_back(entry); + nameResolverEntries_.insert(entry); entry->addSocketEvents(this); return true; } else { @@ -296,9 +289,7 @@ bool PortEventPoll::deleteNameResolver { SharedHandle entry (new KAsyncNameResolverEntry(resolver, command)); - std::deque >::iterator itr = - std::find_if(nameResolverEntries_.begin(), nameResolverEntries_.end(), - derefEqual(entry)); + KAsyncNameResolverEntrySet::iterator itr = nameResolverEntries_.find(entry); if(itr == nameResolverEntries_.end()) { return false; } else { diff --git a/src/PortEventPoll.h b/src/PortEventPoll.h index 937e629e..ad4a4364 100644 --- a/src/PortEventPoll.h +++ b/src/PortEventPoll.h @@ -41,9 +41,10 @@ # include #endif // HAVE_PORT_H -#include +#include #include "Event.h" +#include "a2functional.h" #ifdef ENABLE_ASYNC_DNS # include "AsyncNameResolver.h" #endif // ENABLE_ASYNC_DNS @@ -76,9 +77,14 @@ private: friend int accumulateEvent(int events, const KEvent& event); private: - std::deque > socketEntries_; + typedef std::set, + DerefLess > > KSocketEntrySet; + KSocketEntrySet socketEntries_; #ifdef ENABLE_ASYNC_DNS - std::deque > nameResolverEntries_; + typedef std::set, + DerefLess > > + KAsyncNameResolverEntrySet; + KAsyncNameResolverEntrySet nameResolverEntries_; #endif // ENABLE_ASYNC_DNS int port_;