mirror of https://github.com/aria2/aria2
Use map to make DownloadResult lookup fast
parent
0001f4cfbd
commit
0a4ce4fdb5
|
@ -187,6 +187,20 @@ void removeRequestGroupIndex
|
||||||
}
|
}
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
|
void RequestGroupMan::addDownloadResultIndex
|
||||||
|
(const SharedHandle<DownloadResult>& dr)
|
||||||
|
{
|
||||||
|
assert(drIndex_.count(dr->gid->getNumericId()) == 0);
|
||||||
|
drIndex_[dr->gid->getNumericId()] = dr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RequestGroupMan::removeDownloadResultIndex
|
||||||
|
(const SharedHandle<DownloadResult>& dr)
|
||||||
|
{
|
||||||
|
assert(drIndex_.count(dr->gid->getNumericId()) == 1);
|
||||||
|
drIndex_.erase(dr->gid->getNumericId());
|
||||||
|
}
|
||||||
|
|
||||||
size_t RequestGroupMan::countRequestGroup() const
|
size_t RequestGroupMan::countRequestGroup() const
|
||||||
{
|
{
|
||||||
return requestGroups_.size();
|
return requestGroups_.size();
|
||||||
|
@ -972,13 +986,13 @@ TransferStat RequestGroupMan::calculateStat()
|
||||||
SharedHandle<DownloadResult>
|
SharedHandle<DownloadResult>
|
||||||
RequestGroupMan::findDownloadResult(a2_gid_t gid) const
|
RequestGroupMan::findDownloadResult(a2_gid_t gid) const
|
||||||
{
|
{
|
||||||
for(std::deque<SharedHandle<DownloadResult> >::const_iterator i =
|
std::map<a2_gid_t, SharedHandle<DownloadResult> >::const_iterator i =
|
||||||
downloadResults_.begin(), eoi = downloadResults_.end(); i != eoi; ++i) {
|
drIndex_.find(gid);
|
||||||
if((*i)->gid->getNumericId() == gid) {
|
if(i != drIndex_.end()) {
|
||||||
return *i;
|
return (*i).second;
|
||||||
}
|
} else {
|
||||||
|
return SharedHandle<DownloadResult>();
|
||||||
}
|
}
|
||||||
return SharedHandle<DownloadResult>();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RequestGroupMan::removeDownloadResult(a2_gid_t gid)
|
bool RequestGroupMan::removeDownloadResult(a2_gid_t gid)
|
||||||
|
@ -987,6 +1001,7 @@ bool RequestGroupMan::removeDownloadResult(a2_gid_t gid)
|
||||||
downloadResults_.begin(), eoi = downloadResults_.end(); i != eoi; ++i) {
|
downloadResults_.begin(), eoi = downloadResults_.end(); i != eoi; ++i) {
|
||||||
if((*i)->gid->getNumericId() == gid) {
|
if((*i)->gid->getNumericId() == gid) {
|
||||||
downloadResults_.erase(i);
|
downloadResults_.erase(i);
|
||||||
|
removeDownloadResultIndex(*i);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1005,6 +1020,7 @@ void RequestGroupMan::addDownloadResult(const SharedHandle<DownloadResult>& dr)
|
||||||
++removedErrorResult_;
|
++removedErrorResult_;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
drIndex_.clear();
|
||||||
downloadResults_.clear();
|
downloadResults_.clear();
|
||||||
}
|
}
|
||||||
if(dr->belongsTo == 0 && dr->result != error_code::FINISHED) {
|
if(dr->belongsTo == 0 && dr->result != error_code::FINISHED) {
|
||||||
|
@ -1022,16 +1038,19 @@ void RequestGroupMan::addDownloadResult(const SharedHandle<DownloadResult>& dr)
|
||||||
removedLastErrorResult_ = (*i)->result;
|
removedLastErrorResult_ = (*i)->result;
|
||||||
++removedErrorResult_;
|
++removedErrorResult_;
|
||||||
}
|
}
|
||||||
|
removeDownloadResultIndex(*i);
|
||||||
}
|
}
|
||||||
downloadResults_.erase(downloadResults_.begin(), last);
|
downloadResults_.erase(downloadResults_.begin(), last);
|
||||||
}
|
}
|
||||||
downloadResults_.push_back(dr);
|
downloadResults_.push_back(dr);
|
||||||
|
addDownloadResultIndex(dr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RequestGroupMan::purgeDownloadResult()
|
void RequestGroupMan::purgeDownloadResult()
|
||||||
{
|
{
|
||||||
downloadResults_.clear();
|
downloadResults_.clear();
|
||||||
|
drIndex_.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedHandle<ServerStat>
|
SharedHandle<ServerStat>
|
||||||
|
|
|
@ -67,6 +67,9 @@ private:
|
||||||
// GID => RequestGroup index for faster retrieval.
|
// GID => RequestGroup index for faster retrieval.
|
||||||
std::map<a2_gid_t, SharedHandle<RequestGroup> > groupIndex_;
|
std::map<a2_gid_t, SharedHandle<RequestGroup> > groupIndex_;
|
||||||
std::deque<SharedHandle<DownloadResult> > downloadResults_;
|
std::deque<SharedHandle<DownloadResult> > downloadResults_;
|
||||||
|
// GID => DownloadResult index for faster retrieval.
|
||||||
|
std::map<a2_gid_t, SharedHandle<DownloadResult> > drIndex_;
|
||||||
|
|
||||||
int maxSimultaneousDownloads_;
|
int maxSimultaneousDownloads_;
|
||||||
|
|
||||||
const Option* option_;
|
const Option* option_;
|
||||||
|
@ -113,6 +116,9 @@ private:
|
||||||
void addRequestGroupIndex(const SharedHandle<RequestGroup>& group);
|
void addRequestGroupIndex(const SharedHandle<RequestGroup>& group);
|
||||||
void addRequestGroupIndex
|
void addRequestGroupIndex
|
||||||
(const std::vector<SharedHandle<RequestGroup> >& groups);
|
(const std::vector<SharedHandle<RequestGroup> >& groups);
|
||||||
|
|
||||||
|
void addDownloadResultIndex(const SharedHandle<DownloadResult>& dr);
|
||||||
|
void removeDownloadResultIndex(const SharedHandle<DownloadResult>& dr);
|
||||||
public:
|
public:
|
||||||
RequestGroupMan(const std::vector<SharedHandle<RequestGroup> >& requestGroups,
|
RequestGroupMan(const std::vector<SharedHandle<RequestGroup> >& requestGroups,
|
||||||
int maxSimultaneousDownloads,
|
int maxSimultaneousDownloads,
|
||||||
|
|
|
@ -37,6 +37,7 @@ SharedHandle<DownloadResult> createDownloadResult
|
||||||
std::vector<SharedHandle<FileEntry> > entries;
|
std::vector<SharedHandle<FileEntry> > entries;
|
||||||
entries.push_back(entry);
|
entries.push_back(entry);
|
||||||
SharedHandle<DownloadResult> dr(new DownloadResult());
|
SharedHandle<DownloadResult> dr(new DownloadResult());
|
||||||
|
dr->gid = GroupId::create();
|
||||||
dr->fileEntries = entries;
|
dr->fileEntries = entries;
|
||||||
dr->result = result;
|
dr->result = result;
|
||||||
dr->belongsTo = 0;
|
dr->belongsTo = 0;
|
||||||
|
|
Loading…
Reference in New Issue