diff --git a/src/RequestGroupMan.cc b/src/RequestGroupMan.cc index 25e8ce33..d24e274f 100644 --- a/src/RequestGroupMan.cc +++ b/src/RequestGroupMan.cc @@ -272,6 +272,38 @@ private: } } } + + // Collect statistics during download in PeerStats and update/register + // ServerStatMan + void collectStat(const SharedHandle& group) + { + if(group->getSegmentMan()) { + bool singleConnection = + group->getSegmentMan()->getPeerStats().size() == 1; + const std::vector >& peerStats = + group->getSegmentMan()->getFastestPeerStats(); + for(std::vector >::const_iterator i = + peerStats.begin(), eoi = peerStats.end(); i != eoi; ++i) { + if((*i)->getHostname().empty() || (*i)->getProtocol().empty()) { + continue; + } + int speed = (*i)->getAvgDownloadSpeed(); + if (speed == 0) continue; + + SharedHandle ss = + e_->getRequestGroupMan()->getOrCreateServerStat((*i)->getHostname(), + (*i)->getProtocol()); + ss->increaseCounter(); + ss->updateDownloadSpeed(speed); + if(singleConnection) { + ss->updateSingleConnectionAvgSpeed(speed); + } + else { + ss->updateMultiConnectionAvgSpeed(speed); + } + } + } + } public: ProcessStoppedRequestGroup (DownloadEngine* e, @@ -280,9 +312,10 @@ public: reservedGroups_(reservedGroups) {} - void operator()(const RequestGroupList::value_type& group) + bool operator()(const RequestGroupList::value_type& group) { if(group->getNumCommand() == 0) { + collectStat(group); const SharedHandle& dctx = group->getDownloadContext(); // DownloadContext::resetDownloadStopTime() is only called when // download completed. If @@ -369,79 +402,18 @@ public: executeStopHook(group, e_->getOption(), dr->result); group->releaseRuntimeResource(e_); } + return true; + } else { + return false; } } }; } // namespace -namespace { -class CollectServerStat { -private: - RequestGroupMan* requestGroupMan_; -public: - CollectServerStat(RequestGroupMan* requestGroupMan): - requestGroupMan_(requestGroupMan) {} - - void operator()(const RequestGroupList::value_type& group) - { - if(group->getNumCommand() == 0) { - // Collect statistics during download in PeerStats and update/register - // ServerStatMan - if(group->getSegmentMan()) { - bool singleConnection = - group->getSegmentMan()->getPeerStats().size() == 1; - const std::vector >& peerStats = - group->getSegmentMan()->getFastestPeerStats(); - for(std::vector >::const_iterator i = - peerStats.begin(), eoi = peerStats.end(); i != eoi; ++i) { - if((*i)->getHostname().empty() || (*i)->getProtocol().empty()) { - continue; - } - int speed = (*i)->getAvgDownloadSpeed(); - if (speed == 0) continue; - - SharedHandle ss = - requestGroupMan_->getOrCreateServerStat((*i)->getHostname(), - (*i)->getProtocol()); - ss->increaseCounter(); - ss->updateDownloadSpeed(speed); - if(singleConnection) { - ss->updateSingleConnectionAvgSpeed(speed); - } - else { - ss->updateMultiConnectionAvgSpeed(speed); - } - } - } - } - } -}; -} // namespace - -void RequestGroupMan::updateServerStat() -{ - std::for_each(requestGroups_.begin(), requestGroups_.end(), - CollectServerStat(this)); -} - void RequestGroupMan::removeStoppedGroup(DownloadEngine* e) { size_t numPrev = requestGroups_.size(); - - updateServerStat(); - - std::for_each(requestGroups_.begin(), requestGroups_.end(), - ProcessStoppedRequestGroup(e, reservedGroups_)); - for(RequestGroupList::iterator i = requestGroups_.begin(), - eoi = requestGroups_.end(); i != eoi;) { - const SharedHandle& rg = *i; - if(rg->getNumCommand() == 0) { - i = requestGroups_.erase(i); - eoi = requestGroups_.end(); - } else { - ++i; - } - } + requestGroups_.remove_if(ProcessStoppedRequestGroup(e, reservedGroups_)); size_t numRemoved = numPrev-requestGroups_.size(); if(numRemoved > 0) { A2_LOG_DEBUG(fmt("%lu RequestGroup(s) deleted.", diff --git a/src/RequestGroupMan.h b/src/RequestGroupMan.h index e67cbd70..473941a3 100644 --- a/src/RequestGroupMan.h +++ b/src/RequestGroupMan.h @@ -248,8 +248,6 @@ public: bool addServerStat(const SharedHandle& serverStat); - void updateServerStat(); - bool loadServerStat(const std::string& filename); bool saveServerStat(const std::string& filename) const;