summaryrefslogtreecommitdiff
path: root/src/LibuvEventPoll.cc
diff options
context:
space:
mode:
authorNils Maier <maierman@web.de>2014-12-12 12:21:13 +0100
committerNils Maier <maierman@web.de>2014-12-12 12:21:39 +0100
commit811c0f758da0d161b278fc6b0da333459dd220b4 (patch)
tree8bf1fb31c89143daec82563f67e88056eb444fda /src/LibuvEventPoll.cc
parent6f9ea555c28c1d48f2967aa735d9bba5fb2b31f4 (diff)
Port poll changes to LibuvEventPoll
Diffstat (limited to 'src/LibuvEventPoll.cc')
-rw-r--r--src/LibuvEventPoll.cc45
1 files changed, 25 insertions, 20 deletions
diff --git a/src/LibuvEventPoll.cc b/src/LibuvEventPoll.cc
index 3fc76fda..c5b3f42d 100644
--- a/src/LibuvEventPoll.cc
+++ b/src/LibuvEventPoll.cc
@@ -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;
}