summaryrefslogtreecommitdiff
path: root/src/RequestGroupMan.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2012-12-22 19:29:27 +0900
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2013-02-01 00:03:47 +0900
commit561f0b3e29d0f09f5e64ec9923a4d9627231fa89 (patch)
treea03114d212df0e00e6da31f4b9388b9863e3cdc6 /src/RequestGroupMan.cc
parent643e7222b081c208327a662836a9fa6433c94cb8 (diff)
Use std::deque instead of std::list in IndexedList
We choose faster iteration over rare slower deletion in the middle.
Diffstat (limited to 'src/RequestGroupMan.cc')
-rw-r--r--src/RequestGroupMan.cc43
1 files changed, 24 insertions, 19 deletions
diff --git a/src/RequestGroupMan.cc b/src/RequestGroupMan.cc
index feff9950..2eeccede 100644
--- a/src/RequestGroupMan.cc
+++ b/src/RequestGroupMan.cc
@@ -151,6 +151,15 @@ void RequestGroupMan::addReservedGroup
reservedGroups_.push_back(group->getGID(), group);
}
+namespace {
+struct RequestGroupKeyFunc {
+ a2_gid_t operator()(const SharedHandle<RequestGroup>& rg) const
+ {
+ return rg->getGID();
+ }
+};
+} // namespace
+
void RequestGroupMan::insertReservedGroup
(size_t pos, const std::vector<SharedHandle<RequestGroup> >& groups)
{
@@ -158,10 +167,8 @@ void RequestGroupMan::insertReservedGroup
pos = std::min(reservedGroups_.size(), pos);
RequestGroupList::SeqType::iterator dest = reservedGroups_.begin();
std::advance(dest, pos);
- for(std::vector<SharedHandle<RequestGroup> >::const_iterator i =
- groups.begin(), eoi = groups.end(); i != eoi; ++i, ++dest) {
- dest = reservedGroups_.insert(dest, (*i)->getGID(), *i);
- }
+ reservedGroups_.insert(dest, RequestGroupKeyFunc(),
+ groups.begin(), groups.end());
}
void RequestGroupMan::insertReservedGroup
@@ -482,42 +489,36 @@ void RequestGroupMan::fillRequestGroupFromReserver(DownloadEngine* e)
}
int count = 0;
int num = maxSimultaneousDownloads_-requestGroups_.size();
- // In the following loop, the download which is not ready to start
- // is kept in reservedGroups_. We use iterator to see if we
- // evaluated them all. So don't use empty() for this. Compare to
- // reservedGroups_.end() instead.
- RequestGroupList::SeqType::iterator resitr = reservedGroups_.begin();
- while(count < num && (uriListParser_ || resitr != reservedGroups_.end())) {
- if(uriListParser_ && resitr == reservedGroups_.end()) {
+ std::vector<SharedHandle<RequestGroup> > pending;
+
+ while(count < num && (uriListParser_ || !reservedGroups_.empty())) {
+ if(uriListParser_ && reservedGroups_.empty()) {
std::vector<SharedHandle<RequestGroup> > groups;
// May throw exception
bool ok = createRequestGroupFromUriListParser(groups, option_,
uriListParser_.get());
if(ok) {
appendReservedGroup(reservedGroups_, groups.begin(), groups.end());
- resitr = reservedGroups_.end();
- std::advance(resitr, -static_cast<ssize_t>(groups.size()));
} else {
uriListParser_.reset();
- if(resitr == reservedGroups_.end()) {
+ if(reservedGroups_.empty()) {
break;
}
}
}
- SharedHandle<RequestGroup> groupToAdd = (*resitr).second;
- std::vector<Command*> commands;
+ SharedHandle<RequestGroup> groupToAdd = (*reservedGroups_.begin()).second;
+ reservedGroups_.pop_front();
if((rpc_ && groupToAdd->isPauseRequested()) ||
!groupToAdd->isDependencyResolved()) {
- ++resitr;
+ pending.push_back(groupToAdd);
continue;
}
- ++resitr;
- reservedGroups_.erase(groupToAdd->getGID());
// Drop pieceStorage here because paused download holds its
// reference.
groupToAdd->dropPieceStorage();
configureRequestGroup(groupToAdd);
groupToAdd->setRequestGroupMan(this);
+ std::vector<Command*> commands;
try {
createInitialCommand(groupToAdd, commands, e);
++count;
@@ -543,6 +544,10 @@ void RequestGroupMan::fillRequestGroupFromReserver(DownloadEngine* e)
PREF_ON_DOWNLOAD_START);
notifyDownloadEvent(Notifier::ON_DOWNLOAD_START, groupToAdd);
}
+ if(!pending.empty()) {
+ reservedGroups_.insert(reservedGroups_.begin(), RequestGroupKeyFunc(),
+ pending.begin(), pending.end());
+ }
if(count > 0) {
e->setNoWait(true);
e->setRefreshInterval(0);