diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2012-12-22 19:29:27 +0900 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2013-02-01 00:03:47 +0900 |
| commit | 561f0b3e29d0f09f5e64ec9923a4d9627231fa89 (patch) | |
| tree | a03114d212df0e00e6da31f4b9388b9863e3cdc6 /src/RequestGroupMan.cc | |
| parent | 643e7222b081c208327a662836a9fa6433c94cb8 (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.cc | 43 |
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); |
