Use IndexedList::remove_if to clean up RequestGroupMan::removeStoppedGroup

pull/57/head
Tatsuhiro Tsujikawa 2013-03-03 18:08:19 +09:00
parent d4ba562710
commit baaa3a4fb2
2 changed files with 38 additions and 68 deletions

View File

@ -272,6 +272,38 @@ private:
}
}
}
// Collect statistics during download in PeerStats and update/register
// ServerStatMan
void collectStat(const SharedHandle<RequestGroup>& group)
{
if(group->getSegmentMan()) {
bool singleConnection =
group->getSegmentMan()->getPeerStats().size() == 1;
const std::vector<SharedHandle<PeerStat> >& peerStats =
group->getSegmentMan()->getFastestPeerStats();
for(std::vector<SharedHandle<PeerStat> >::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<ServerStat> 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<DownloadContext>& 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<SharedHandle<PeerStat> >& peerStats =
group->getSegmentMan()->getFastestPeerStats();
for(std::vector<SharedHandle<PeerStat> >::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<ServerStat> 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<RequestGroup>& 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.",

View File

@ -248,8 +248,6 @@ public:
bool addServerStat(const SharedHandle<ServerStat>& serverStat);
void updateServerStat();
bool loadServerStat(const std::string& filename);
bool saveServerStat(const std::string& filename) const;