Use std::set for socketEntries_ and nameResolverEntries_ in KqueueEventPoll

pull/14/head
Tatsuhiro Tsujikawa 2012-03-24 21:19:57 +09:00
parent 9f892d92f3
commit d8948056b3
2 changed files with 21 additions and 24 deletions

View File

@ -141,9 +141,8 @@ void KqueueEventPoll::poll(const struct timeval& tv)
// own timeout and ares may create new sockets or closes socket in // 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 // their API. So we call ares_process_fd for all ares_channel and
// re-register their sockets. // re-register their sockets.
for(std::deque<SharedHandle<KAsyncNameResolverEntry> >::iterator i = for(KAsyncNameResolverEntrySet::iterator i = nameResolverEntries_.begin(),
nameResolverEntries_.begin(), eoi = nameResolverEntries_.end(); eoi = nameResolverEntries_.end(); i != eoi; ++i) {
i != eoi; ++i) {
(*i)->processTimeout(); (*i)->processTimeout();
(*i)->removeSocketEvents(this); (*i)->removeSocketEvents(this);
(*i)->addSocketEvents(this); (*i)->addSocketEvents(this);
@ -172,9 +171,7 @@ bool KqueueEventPoll::addEvents
(sock_t socket, const KqueueEventPoll::KEvent& event) (sock_t socket, const KqueueEventPoll::KEvent& event)
{ {
SharedHandle<KSocketEntry> socketEntry(new KSocketEntry(socket)); SharedHandle<KSocketEntry> socketEntry(new KSocketEntry(socket));
std::deque<SharedHandle<KSocketEntry> >::iterator i = KSocketEntrySet::iterator i = socketEntries_.lower_bound(socketEntry);
std::lower_bound(socketEntries_.begin(), socketEntries_.end(), socketEntry,
DerefLess<SharedHandle<KSocketEntry> >());
int r = 0; int r = 0;
struct timespec zeroTimeout = { 0, 0 }; struct timespec zeroTimeout = { 0, 0 };
struct kevent changelist[2]; struct kevent changelist[2];
@ -213,7 +210,7 @@ bool KqueueEventPoll::addEvents(sock_t socket, Command* command,
#ifdef ENABLE_ASYNC_DNS #ifdef ENABLE_ASYNC_DNS
bool KqueueEventPoll::addEvents(sock_t socket, Command* command, int events, bool KqueueEventPoll::addEvents(sock_t socket, Command* command, int events,
const SharedHandle<AsyncNameResolver>& rs) const SharedHandle<AsyncNameResolver>& rs)
{ {
return addEvents(socket, KADNSEvent(rs, command, socket, events)); return addEvents(socket, KADNSEvent(rs, command, socket, events));
} }
@ -223,10 +220,11 @@ bool KqueueEventPoll::deleteEvents(sock_t socket,
const KqueueEventPoll::KEvent& event) const KqueueEventPoll::KEvent& event)
{ {
SharedHandle<KSocketEntry> socketEntry(new KSocketEntry(socket)); SharedHandle<KSocketEntry> socketEntry(new KSocketEntry(socket));
std::deque<SharedHandle<KSocketEntry> >::iterator i = KSocketEntrySet::iterator i = socketEntries_.find(socketEntry);
std::lower_bound(socketEntries_.begin(), socketEntries_.end(), socketEntry, if(i == socketEntries_.end()) {
DerefLess<SharedHandle<KSocketEntry> >()); A2_LOG_DEBUG(fmt("Socket %d is not found in SocketEntries.", socket));
if(i != socketEntries_.end() && *(*i) == *socketEntry) { return false;
} else {
event.removeSelf(*i); event.removeSelf(*i);
int r = 0; int r = 0;
struct timespec zeroTimeout = { 0, 0 }; struct timespec zeroTimeout = { 0, 0 };
@ -244,9 +242,6 @@ bool KqueueEventPoll::deleteEvents(sock_t socket,
} else { } else {
return true; return true;
} }
} else {
A2_LOG_DEBUG(fmt("Socket %d is not found in SocketEntries.", socket));
return false;
} }
} }
@ -271,11 +266,9 @@ bool KqueueEventPoll::addNameResolver
{ {
SharedHandle<KAsyncNameResolverEntry> entry SharedHandle<KAsyncNameResolverEntry> entry
(new KAsyncNameResolverEntry(resolver, command)); (new KAsyncNameResolverEntry(resolver, command));
std::deque<SharedHandle<KAsyncNameResolverEntry> >::iterator itr = KAsyncNameResolverEntrySet::iterator itr = nameResolverEntries_.find(entry);
std::find_if(nameResolverEntries_.begin(), nameResolverEntries_.end(),
derefEqual(entry));
if(itr == nameResolverEntries_.end()) { if(itr == nameResolverEntries_.end()) {
nameResolverEntries_.push_back(entry); nameResolverEntries_.insert(entry);
entry->addSocketEvents(this); entry->addSocketEvents(this);
return true; return true;
} else { } else {
@ -288,9 +281,7 @@ bool KqueueEventPoll::deleteNameResolver
{ {
SharedHandle<KAsyncNameResolverEntry> entry SharedHandle<KAsyncNameResolverEntry> entry
(new KAsyncNameResolverEntry(resolver, command)); (new KAsyncNameResolverEntry(resolver, command));
std::deque<SharedHandle<KAsyncNameResolverEntry> >::iterator itr = KAsyncNameResolverEntrySet::iterator itr = nameResolverEntries_.find(entry);
std::find_if(nameResolverEntries_.begin(), nameResolverEntries_.end(),
derefEqual(entry));
if(itr == nameResolverEntries_.end()) { if(itr == nameResolverEntries_.end()) {
return false; return false;
} else { } else {

View File

@ -41,9 +41,10 @@
#include <sys/event.h> #include <sys/event.h>
#include <sys/time.h> #include <sys/time.h>
#include <deque> #include <set>
#include "Event.h" #include "Event.h"
#include "a2functional.h"
#ifdef ENABLE_ASYNC_DNS #ifdef ENABLE_ASYNC_DNS
# include "AsyncNameResolver.h" # include "AsyncNameResolver.h"
#endif // ENABLE_ASYNC_DNS #endif // ENABLE_ASYNC_DNS
@ -74,9 +75,14 @@ private:
friend int accumulateEvent(int events, const KEvent& event); friend int accumulateEvent(int events, const KEvent& event);
private: private:
std::deque<SharedHandle<KSocketEntry> > socketEntries_; typedef std::set<SharedHandle<KSocketEntry>,
DerefLess<SharedHandle<KSocketEntry> > > KSocketEntrySet;
KSocketEntrySet socketEntries_;
#ifdef ENABLE_ASYNC_DNS #ifdef ENABLE_ASYNC_DNS
std::deque<SharedHandle<KAsyncNameResolverEntry> > nameResolverEntries_; typedef std::set<SharedHandle<KAsyncNameResolverEntry>,
DerefLess<SharedHandle<KAsyncNameResolverEntry> > >
KAsyncNameResolverEntrySet;
KAsyncNameResolverEntrySet nameResolverEntries_;
#endif // ENABLE_ASYNC_DNS #endif // ENABLE_ASYNC_DNS
int kqfd_; int kqfd_;