mirror of https://github.com/aria2/aria2
2009-03-13 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Reuse URIs when all unused URIs run out. * src/OptionHandlerFactory.cc * src/RequestGroup.cc * src/prefs.cc * src/prefs.hpull/1/head
parent
15582ed8cd
commit
d8678a8dd0
|
@ -1,3 +1,11 @@
|
|||
2009-03-13 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
|
||||
|
||||
Reuse URIs when all unused URIs run out.
|
||||
* src/OptionHandlerFactory.cc
|
||||
* src/RequestGroup.cc
|
||||
* src/prefs.cc
|
||||
* src/prefs.h
|
||||
|
||||
2009-03-13 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
|
||||
|
||||
Refactored BtMessage subclasses. BtCancelMessage, BtRequestMessage
|
||||
|
|
|
@ -453,6 +453,14 @@ OptionHandlers OptionHandlerFactory::createOptionHandlers()
|
|||
op->addTag(TAG_HTTP);
|
||||
handlers.push_back(op);
|
||||
}
|
||||
{
|
||||
SharedHandle<OptionHandler> op(new BooleanOptionHandler
|
||||
(PREF_REUSE_URI,
|
||||
NO_DESCRIPTION,
|
||||
V_TRUE));
|
||||
op->hide();
|
||||
handlers.push_back(op);
|
||||
}
|
||||
{
|
||||
SharedHandle<UnitNumberOptionHandler> op(new UnitNumberOptionHandler
|
||||
(PREF_SEGMENT_SIZE,
|
||||
|
|
|
@ -562,6 +562,40 @@ void RequestGroup::createNextCommand(std::deque<Command*>& commands,
|
|||
unsigned int numCommand,
|
||||
const std::string& method)
|
||||
{
|
||||
if(_option->getAsBool(PREF_REUSE_URI) && _uris.empty()) {
|
||||
std::deque<std::string> uris = _spentUris;
|
||||
std::sort(uris.begin(), uris.end());
|
||||
uris.erase(std::unique(uris.begin(), uris.end()), uris.end());
|
||||
|
||||
std::deque<std::string> errorUris(_uriResults.size());
|
||||
std::transform(_uriResults.begin(), _uriResults.end(),
|
||||
errorUris.begin(), std::mem_fun_ref(&URIResult::getURI));
|
||||
std::sort(errorUris.begin(), errorUris.end());
|
||||
errorUris.erase(std::unique(errorUris.begin(), errorUris.end()),
|
||||
errorUris.end());
|
||||
|
||||
std::deque<std::string> reusableURIs;
|
||||
std::set_difference(uris.begin(), uris.end(),
|
||||
errorUris.begin(), errorUris.end(),
|
||||
std::back_inserter(reusableURIs));
|
||||
size_t ininum = reusableURIs.size();
|
||||
_logger->debug("Found %u reusable URIs",
|
||||
static_cast<unsigned int>(ininum));
|
||||
// Reuse at least _numConcurrentCommand URIs here to avoid to
|
||||
// run this process repeatedly.
|
||||
if(ininum > 0 && ininum < _numConcurrentCommand) {
|
||||
_logger->debug("fewer than _numConcurrentCommand=%u",
|
||||
_numConcurrentCommand);
|
||||
for(size_t i = 0; i < _numConcurrentCommand/ininum; ++i) {
|
||||
_uris.insert(_uris.end(), reusableURIs.begin(), reusableURIs.end());
|
||||
}
|
||||
_uris.insert(_uris.end(), reusableURIs.begin(),
|
||||
reusableURIs.begin()+(_numConcurrentCommand%ininum));
|
||||
_logger->debug("Duplication complete: now %u URIs for reuse",
|
||||
static_cast<unsigned int>(_uris.size()));
|
||||
}
|
||||
}
|
||||
|
||||
std::deque<std::string> pendingURIs;
|
||||
for(; numCommand--; ) {
|
||||
std::string uri = _uriSelector->select(_uris);
|
||||
|
|
|
@ -160,6 +160,8 @@ const std::string PREF_ENABLE_HTTP_SERVER("enable-http-server");
|
|||
const std::string PREF_RESET_URI("reset-uri");
|
||||
// value: true | false
|
||||
const std::string PREF_DRY_RUN("dry-run");
|
||||
// value: true | false
|
||||
const std::string PREF_REUSE_URI("reuse-uri");
|
||||
|
||||
/**
|
||||
* FTP related preferences
|
||||
|
|
|
@ -164,6 +164,8 @@ extern const std::string PREF_ENABLE_HTTP_SERVER;
|
|||
extern const std::string PREF_RESET_URI;
|
||||
// value: true | false
|
||||
extern const std::string PREF_DRY_RUN;
|
||||
// value: true | false
|
||||
extern const std::string PREF_REUSE_URI;
|
||||
|
||||
/**
|
||||
* FTP related preferences
|
||||
|
|
Loading…
Reference in New Issue