Port poll changes to LibuvEventPoll

pull/314/head
Nils Maier 2014-12-12 12:21:13 +01:00
parent 6f9ea555c2
commit 811c0f758d
2 changed files with 32 additions and 25 deletions

View File

@ -229,11 +229,11 @@ void LibuvEventPoll::pollCallback(KPoll* poll, int status, int events)
bool LibuvEventPoll::addEvents(sock_t socket,
const LibuvEventPoll::KEvent& event)
{
auto socketEntry = std::make_shared<KSocketEntry>(socket);
auto i = socketEntries_.lower_bound(socketEntry);
auto i = socketEntries_.lower_bound(socket);
if (i != socketEntries_.end() && **i == *socketEntry) {
event.addSelf((*i).get());
if (i != socketEntries_.end() && i->first == socket) {
auto& socketEntry = i->second;
event.addSelf(&socketEntry);
auto poll = polls_.find(socket);
if (poll == polls_.end()) {
throw std::logic_error("Invalid socket");
@ -242,9 +242,10 @@ bool LibuvEventPoll::addEvents(sock_t socket,
return true;
}
socketEntries_.insert(i, socketEntry);
event.addSelf(socketEntry.get());
auto poll = new KPoll(this, socketEntry.get(), socket);
i = socketEntries_.insert(i, std::make_pair(socket, KSocketEntry(socket)));
auto& socketEntry = i->second;
event.addSelf(&socketEntry);
auto poll = new KPoll(this, &socketEntry, socket);
polls_[socket] = poll;
poll->start();
return true;
@ -267,22 +268,22 @@ bool LibuvEventPoll::addEvents(sock_t socket, Command* command, int events,
bool LibuvEventPoll::deleteEvents(sock_t socket,
const LibuvEventPoll::KEvent& event)
{
auto socketEntry = std::make_shared<KSocketEntry>(socket);
auto i = socketEntries_.find(socketEntry);
auto i = socketEntries_.find(socket);
if (i == socketEntries_.end()) {
A2_LOG_DEBUG(fmt("Socket %d is not found in SocketEntries.", socket));
return false;
}
event.removeSelf((*i).get());
auto& socketEntry = (*i).second;
event.removeSelf(&socketEntry);
auto poll = polls_.find(socket);
if (poll == polls_.end()) {
return false;
}
if ((*i)->eventEmpty()) {
if (socketEntry.eventEmpty()) {
poll->second->close();
polls_.erase(poll);
socketEntries_.erase(i);
@ -312,25 +313,29 @@ bool LibuvEventPoll::deleteEvents(sock_t socket, Command* command,
bool LibuvEventPoll::addNameResolver(const std::shared_ptr<AsyncNameResolver>& resolver,
Command* command)
{
auto entry = std::make_shared<KAsyncNameResolverEntry>(resolver, command);
auto itr = nameResolverEntries_.lower_bound(entry);
if (itr != nameResolverEntries_.end() && *(*itr) == *entry) {
auto key = std::make_pair(resolver.get(), command);
auto itr = nameResolverEntries_.lower_bound(key);
if(itr != std::end(nameResolverEntries_) && (*itr).first == key) {
return false;
}
nameResolverEntries_.insert(itr, entry);
entry->addSocketEvents(this);
itr = nameResolverEntries_.insert
(itr, std::make_pair(key, KAsyncNameResolverEntry(resolver, command)));
(*itr).second.addSocketEvents(this);
return true;
}
bool LibuvEventPoll::deleteNameResolver(const std::shared_ptr<AsyncNameResolver>& resolver,
Command* command)
{
auto entry = std::make_shared<KAsyncNameResolverEntry>(resolver, command);
auto itr = nameResolverEntries_.find(entry);
if (itr == nameResolverEntries_.end()) {
auto key = std::make_pair(resolver.get(), command);
auto itr = nameResolverEntries_.find(key);
if(itr == std::end(nameResolverEntries_)) {
return false;
}
(*itr)->removeSocketEvents(this);
(*itr).second.removeSocketEvents(this);
nameResolverEntries_.erase(itr);
return true;
}

View File

@ -66,6 +66,10 @@ private:
class KSocketEntry: public SocketEntry<KCommandEvent, KADNSEvent> {
public:
KSocketEntry(sock_t socket);
KSocketEntry(const KSocketEntry&) = delete;
KSocketEntry(KSocketEntry&&) = default;
int getEvents() const;
};
@ -105,15 +109,13 @@ private:
}
};
typedef std::set<std::shared_ptr<KSocketEntry>,
DerefLess<std::shared_ptr<KSocketEntry> > > KSocketEntrySet;
typedef std::map<sock_t, KSocketEntry> KSocketEntrySet;
typedef std::map<sock_t, KPoll*> KPolls;
#ifdef ENABLE_ASYNC_DNS
typedef std::set<std::shared_ptr<KAsyncNameResolverEntry>,
DerefLess<std::shared_ptr<KAsyncNameResolverEntry> > >
KAsyncNameResolverEntrySet;
typedef std::map<std::pair<AsyncNameResolver*, Command*>,
KAsyncNameResolverEntry> KAsyncNameResolverEntrySet;
#endif // ENABLE_ASYNC_DNS
uv_loop_t* loop_;