summaryrefslogtreecommitdiff
path: root/src/DHTMessageTracker.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-02-28 16:04:52 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-02-28 16:04:52 +0000
commit72e475dfdeaa4a87dff0eef994e7814e94c40363 (patch)
tree94a84e90c14876db223e4a733f651fe0b034f5e9 /src/DHTMessageTracker.cc
parentc342bde9627b434effbc0cd10b817670d1da0923 (diff)
2010-03-01 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Avoid to calculate end() iterator in each loop. std::deque is particularly slow. Make sure that recalculate end iterator if element is erased during loop.
Diffstat (limited to 'src/DHTMessageTracker.cc')
-rw-r--r--src/DHTMessageTracker.cc15
1 files changed, 9 insertions, 6 deletions
diff --git a/src/DHTMessageTracker.cc b/src/DHTMessageTracker.cc
index 2f84c1a0..970ddf0e 100644
--- a/src/DHTMessageTracker.cc
+++ b/src/DHTMessageTracker.cc
@@ -82,7 +82,7 @@ DHTMessageTracker::messageArrived(const BDE& dict,
util::toHex(tid.s()).c_str(), ipaddr.c_str(), port);
}
for(std::deque<SharedHandle<DHTMessageTrackerEntry> >::iterator i =
- _entries.begin(); i != _entries.end(); ++i) {
+ _entries.begin(), eoi = _entries.end(); i != eoi; ++i) {
if((*i)->match(tid.s(), ipaddr, port)) {
SharedHandle<DHTMessageTrackerEntry> entry = *i;
_entries.erase(i);
@@ -113,12 +113,13 @@ DHTMessageTracker::messageArrived(const BDE& dict,
void DHTMessageTracker::handleTimeout()
{
- for(std::deque<SharedHandle<DHTMessageTrackerEntry> >::iterator i = _entries.begin();
- i != _entries.end();) {
+ for(std::deque<SharedHandle<DHTMessageTrackerEntry> >::iterator i =
+ _entries.begin(), eoi = _entries.end(); i != eoi;) {
if((*i)->isTimeout()) {
try {
SharedHandle<DHTMessageTrackerEntry> entry = *i;
i = _entries.erase(i);
+ eoi = _entries.end();
SharedHandle<DHTNode> node = entry->getTargetNode();
if(_logger->debug()) {
_logger->debug("Message timeout: To:%s:%u",
@@ -149,9 +150,11 @@ void DHTMessageTracker::handleTimeout()
SharedHandle<DHTMessageTrackerEntry>
DHTMessageTracker::getEntryFor(const SharedHandle<DHTMessage>& message) const
{
- for(std::deque<SharedHandle<DHTMessageTrackerEntry> >::const_iterator i = _entries.begin();
- i != _entries.end(); ++i) {
- if((*i)->match(message->getTransactionID(), message->getRemoteNode()->getIPAddress(), message->getRemoteNode()->getPort())) {
+ for(std::deque<SharedHandle<DHTMessageTrackerEntry> >::const_iterator i =
+ _entries.begin(), eoi = _entries.end(); i != eoi; ++i) {
+ if((*i)->match(message->getTransactionID(),
+ message->getRemoteNode()->getIPAddress(),
+ message->getRemoteNode()->getPort())) {
return *i;
}
}