mirror of https://github.com/aria2/aria2
2008-04-20 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Eliminates the time lag between sequential downloads and commands in the same RequestGroup. In old implementation, aria2 occasionally waits 1 seconds before executing next command or RequestGroup. This is really a waste of time, and new implementation eliminates this unnecessary time lag. * src/AbstractCommand.cc * src/AutoSaveCommand.cc * src/CheckIntegrityCommand.cc * src/Command.{cc, h} * src/DownloadEngine.{cc, h} * src/DownloadEngineFactory.cc * src/FileAllocationCommand.cc * src/FileAllocationDispatcherCommand.cc * src/FillRequestGroupCommand.cc * src/FtpInitiateConnectionCommand.cc * src/HaveEraseCommand.cc * src/HttpInitiateConnectionCommand.cc * src/HttpResponseCommand.cc * src/RealtimeCommand.cc * src/RequestGroup.cc * src/RequestGroupMan.cc * src/StreamFileAllocationEntry.cc * src/TimeBasedCommand.{cc, h} * src/TimedHaltCommand.ccpull/1/head
parent
3505201f33
commit
c1c5e7369f
28
ChangeLog
28
ChangeLog
|
@ -1,3 +1,31 @@
|
|||
2008-04-20 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
|
||||
|
||||
Eliminates the time lag between sequential downloads and commands in
|
||||
the same RequestGroup.
|
||||
In old implementation, aria2 occasionally waits 1 seconds before
|
||||
executing next command or RequestGroup.
|
||||
This is really a waste of time, and new implementation eliminates
|
||||
this unnecessary time lag.
|
||||
* src/AbstractCommand.cc
|
||||
* src/AutoSaveCommand.cc
|
||||
* src/CheckIntegrityCommand.cc
|
||||
* src/Command.{cc, h}
|
||||
* src/DownloadEngine.{cc, h}
|
||||
* src/DownloadEngineFactory.cc
|
||||
* src/FileAllocationCommand.cc
|
||||
* src/FileAllocationDispatcherCommand.cc
|
||||
* src/FillRequestGroupCommand.cc
|
||||
* src/FtpInitiateConnectionCommand.cc
|
||||
* src/HaveEraseCommand.cc
|
||||
* src/HttpInitiateConnectionCommand.cc
|
||||
* src/HttpResponseCommand.cc
|
||||
* src/RealtimeCommand.cc
|
||||
* src/RequestGroup.cc
|
||||
* src/RequestGroupMan.cc
|
||||
* src/StreamFileAllocationEntry.cc
|
||||
* src/TimeBasedCommand.{cc, h}
|
||||
* src/TimedHaltCommand.cc
|
||||
|
||||
2008-04-20 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
|
||||
|
||||
Rewritten SharedHandle. Now copy constructor taking raw pointer has
|
||||
|
|
|
@ -190,6 +190,7 @@ bool AbstractCommand::prepareForRetry(time_t wait) {
|
|||
}
|
||||
Command* command = InitiateConnectionCommandFactory::createInitiateConnectionCommand(cuid, req, _requestGroup, e);
|
||||
if(wait == 0) {
|
||||
e->setNoWait(true);
|
||||
e->commands.push_back(command);
|
||||
} else {
|
||||
SleepCommand* scom = new SleepCommand(cuid, e, command, wait);
|
||||
|
@ -318,6 +319,7 @@ void AbstractCommand::prepareForNextAction(Command* nextCommand)
|
|||
{
|
||||
CheckIntegrityEntryHandle entry(new StreamCheckIntegrityEntry(req, _requestGroup, nextCommand));
|
||||
e->addCommand(_requestGroup->processCheckIntegrityEntry(entry, e));
|
||||
e->setNoWait(true);
|
||||
}
|
||||
|
||||
} // namespace aria2
|
||||
|
|
|
@ -39,7 +39,7 @@
|
|||
namespace aria2 {
|
||||
|
||||
AutoSaveCommand::AutoSaveCommand(int32_t cuid, DownloadEngine* e, time_t interval):
|
||||
TimeBasedCommand(cuid, e, interval) {}
|
||||
TimeBasedCommand(cuid, e, interval, true) {}
|
||||
|
||||
AutoSaveCommand::~AutoSaveCommand() {}
|
||||
|
||||
|
|
|
@ -71,6 +71,7 @@ bool CheckIntegrityCommand::executeInternal()
|
|||
_requestGroup->getFilePath().c_str());
|
||||
_e->addCommand(_entry->onDownloadIncomplete(_e));
|
||||
}
|
||||
_e->setNoWait(true);
|
||||
return true;
|
||||
} else {
|
||||
_e->commands.push_back(this);
|
||||
|
|
|
@ -55,4 +55,9 @@ void Command::transitStatus()
|
|||
}
|
||||
}
|
||||
|
||||
void Command::setStatus(STATUS status)
|
||||
{
|
||||
this->status = status;
|
||||
}
|
||||
|
||||
} // namespace aria2
|
||||
|
|
|
@ -51,7 +51,8 @@ public:
|
|||
STATUS_ALL,
|
||||
STATUS_INACTIVE,
|
||||
STATUS_ACTIVE,
|
||||
STATUS_REALTIME
|
||||
STATUS_REALTIME,
|
||||
STATUS_ONESHOT_REALTIME
|
||||
};
|
||||
private:
|
||||
CommandUuid uuid;
|
||||
|
@ -77,6 +78,8 @@ public:
|
|||
|
||||
void setStatusRealtime() { this->status = STATUS_REALTIME; }
|
||||
|
||||
void setStatus(STATUS status);
|
||||
|
||||
bool statusMatch(Command::STATUS statusFilter) const
|
||||
{
|
||||
return statusFilter <= status;
|
||||
|
|
|
@ -85,7 +85,7 @@ bool NameResolverEntry::operator==(const NameResolverEntry& entry)
|
|||
|
||||
DownloadEngine::DownloadEngine():logger(LogFactory::getInstance()),
|
||||
_haltRequested(false),
|
||||
noWait(false)
|
||||
_noWait(false)
|
||||
{}
|
||||
|
||||
DownloadEngine::~DownloadEngine() {
|
||||
|
@ -105,7 +105,8 @@ void DownloadEngine::cleanQueue() {
|
|||
commands.clear();
|
||||
}
|
||||
|
||||
void DownloadEngine::executeCommand(Command::STATUS statusFilter)
|
||||
static void executeCommand(std::deque<Command*>& commands,
|
||||
Command::STATUS statusFilter)
|
||||
{
|
||||
size_t max = commands.size();
|
||||
for(size_t i = 0; i < max; i++) {
|
||||
|
@ -126,19 +127,19 @@ void DownloadEngine::executeCommand(Command::STATUS statusFilter)
|
|||
void DownloadEngine::run() {
|
||||
Time cp;
|
||||
cp.setTimeInSec(0);
|
||||
Commands activeCommands;
|
||||
while(!commands.empty()) {
|
||||
if(cp.elapsed(1)) {
|
||||
cp.reset();
|
||||
executeCommand(Command::STATUS_ALL);
|
||||
executeCommand(commands, Command::STATUS_ALL);
|
||||
} else {
|
||||
executeCommand(Command::STATUS_ACTIVE);
|
||||
executeCommand(commands, Command::STATUS_ACTIVE);
|
||||
}
|
||||
executeCommand(_routineCommands, Command::STATUS_ALL);
|
||||
afterEachIteration();
|
||||
if(!commands.empty()) {
|
||||
waitData();
|
||||
}
|
||||
noWait = false;
|
||||
_noWait = false;
|
||||
calculateStatistics();
|
||||
}
|
||||
onEndOfRun();
|
||||
|
@ -173,7 +174,7 @@ void DownloadEngine::waitData() {
|
|||
}
|
||||
#endif // ENABLE_ASYNC_DNS
|
||||
|
||||
tv.tv_sec = noWait ? 0 : 1;
|
||||
tv.tv_sec = _noWait ? 0 : 1;
|
||||
tv.tv_usec = 0;
|
||||
int retval = select(fdmax+1, &rfds, &wfds, NULL, &tv);
|
||||
if(retval > 0) {
|
||||
|
@ -350,4 +351,14 @@ bool DownloadEngine::deleteNameResolverCheck(const NameResolverHandle& resolver,
|
|||
}
|
||||
#endif // ENABLE_ASYNC_DNS
|
||||
|
||||
void DownloadEngine::setNoWait(bool b)
|
||||
{
|
||||
_noWait = b;
|
||||
}
|
||||
|
||||
void DownloadEngine::addRoutineCommand(Command* command)
|
||||
{
|
||||
_routineCommands.push_back(command);
|
||||
}
|
||||
|
||||
} // namespace aria2
|
||||
|
|
|
@ -107,7 +107,6 @@ private:
|
|||
void shortSleep() const;
|
||||
bool addSocket(const SocketEntry& socketEntry);
|
||||
bool deleteSocket(const SocketEntry& socketEntry);
|
||||
void executeCommand(Command::STATUS statusFilter);
|
||||
|
||||
/**
|
||||
* Delegates to StatCalc
|
||||
|
@ -118,8 +117,12 @@ private:
|
|||
|
||||
void afterEachIteration();
|
||||
|
||||
private:
|
||||
bool _noWait;
|
||||
|
||||
std::deque<Command*> _routineCommands;
|
||||
|
||||
public:
|
||||
bool noWait;
|
||||
std::deque<Command*> commands;
|
||||
SharedHandle<RequestGroupMan> _requestGroupMan;
|
||||
SharedHandle<FileAllocationMan> _fileAllocationMan;
|
||||
|
@ -163,6 +166,10 @@ public:
|
|||
}
|
||||
|
||||
void requestHalt();
|
||||
|
||||
void setNoWait(bool b);
|
||||
|
||||
void addRoutineCommand(Command* command);
|
||||
};
|
||||
|
||||
typedef SharedHandle<DownloadEngine> DownloadEngineHandle;
|
||||
|
|
|
@ -83,14 +83,14 @@ DownloadEngineFactory::newDownloadEngine(Option* op,
|
|||
#ifdef ENABLE_MESSAGE_DIGEST
|
||||
e->_checkIntegrityMan.reset(new CheckIntegrityMan());
|
||||
#endif // ENABLE_MESSAGE_DIGEST
|
||||
e->commands.push_back(new FillRequestGroupCommand(CUIDCounterSingletonHolder::instance()->newID(), e.get(), 1));
|
||||
e->commands.push_back(new FileAllocationDispatcherCommand(CUIDCounterSingletonHolder::instance()->newID(), e.get()));
|
||||
e->commands.push_back(new AutoSaveCommand(CUIDCounterSingletonHolder::instance()->newID(), e.get(), op->getAsInt(PREF_AUTO_SAVE_INTERVAL)));
|
||||
e->commands.push_back(new HaveEraseCommand(CUIDCounterSingletonHolder::instance()->newID(), e.get(), 10));
|
||||
e->addRoutineCommand(new FillRequestGroupCommand(CUIDCounterSingletonHolder::instance()->newID(), e.get(), 1));
|
||||
e->addRoutineCommand(new FileAllocationDispatcherCommand(CUIDCounterSingletonHolder::instance()->newID(), e.get()));
|
||||
e->addRoutineCommand(new AutoSaveCommand(CUIDCounterSingletonHolder::instance()->newID(), e.get(), op->getAsInt(PREF_AUTO_SAVE_INTERVAL)));
|
||||
e->addRoutineCommand(new HaveEraseCommand(CUIDCounterSingletonHolder::instance()->newID(), e.get(), 10));
|
||||
{
|
||||
time_t stopSec = op->getAsInt(PREF_STOP);
|
||||
if(stopSec > 0) {
|
||||
e->commands.push_back(new TimedHaltCommand(CUIDCounterSingletonHolder::instance()->newID(), e.get(), stopSec));
|
||||
e->addRoutineCommand(new TimedHaltCommand(CUIDCounterSingletonHolder::instance()->newID(), e.get(), stopSec));
|
||||
}
|
||||
}
|
||||
return e;
|
||||
|
|
|
@ -63,7 +63,7 @@ bool FileAllocationCommand::executeInternal()
|
|||
_e->_fileAllocationMan->markCurrentFileAllocationEntryDone();
|
||||
|
||||
_e->addCommand(_fileAllocationEntry->prepareForNextAction(_e));
|
||||
|
||||
_e->setNoWait(true);
|
||||
return true;
|
||||
} else {
|
||||
_e->commands.push_back(this);
|
||||
|
|
|
@ -68,10 +68,10 @@ bool FileAllocationDispatcherCommand::execute()
|
|||
_e,
|
||||
entry);
|
||||
_e->commands.push_back(command);
|
||||
_e->noWait = true;
|
||||
_e->setNoWait(true);
|
||||
}
|
||||
|
||||
_e->commands.push_back(this);
|
||||
_e->addRoutineCommand(this);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -68,7 +68,7 @@ bool FillRequestGroupCommand::execute()
|
|||
if(_e->_requestGroupMan->downloadFinished()) {
|
||||
return true;
|
||||
}
|
||||
_e->commands.push_back(this);
|
||||
_e->addRoutineCommand(this);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -61,7 +61,7 @@ FtpInitiateConnectionCommand::FtpInitiateConnectionCommand(int cuid,
|
|||
nameResolver(new NameResolver())
|
||||
{
|
||||
setTimeout(e->option->getAsInt(PREF_DNS_TIMEOUT));
|
||||
setStatusActive();
|
||||
setStatus(Command::STATUS_ONESHOT_REALTIME);
|
||||
disableReadCheckSocket();
|
||||
disableWriteCheckSocket();
|
||||
}
|
||||
|
|
|
@ -41,7 +41,7 @@
|
|||
namespace aria2 {
|
||||
|
||||
HaveEraseCommand::HaveEraseCommand(int32_t cuid, DownloadEngine* e, time_t interval)
|
||||
:TimeBasedCommand(cuid, e, interval) {}
|
||||
:TimeBasedCommand(cuid, e, interval, true) {}
|
||||
|
||||
HaveEraseCommand::~HaveEraseCommand() {}
|
||||
|
||||
|
|
|
@ -59,7 +59,7 @@ HttpInitiateConnectionCommand::HttpInitiateConnectionCommand(int cuid,
|
|||
nameResolver(new NameResolver())
|
||||
{
|
||||
setTimeout(e->option->getAsInt(PREF_DNS_TIMEOUT));
|
||||
setStatusActive();
|
||||
setStatus(Command::STATUS_ONESHOT_REALTIME);
|
||||
disableReadCheckSocket();
|
||||
disableWriteCheckSocket();
|
||||
}
|
||||
|
|
|
@ -91,7 +91,6 @@ bool HttpResponseCommand::executeInternal()
|
|||
if(httpResponse->isRedirect()) {
|
||||
httpResponse->processRedirect();
|
||||
logger->info(MSG_REDIRECT, cuid, httpResponse->getRedirectURI().c_str());
|
||||
e->noWait = true;
|
||||
return prepareForRetry(0);
|
||||
}
|
||||
if(!_requestGroup->isSingleHostMultiConnectionEnabled()) {
|
||||
|
@ -152,7 +151,6 @@ bool HttpResponseCommand::handleDefaultEncoding(const HttpResponseHandle& httpRe
|
|||
_requestGroup->getSegmentMan()->cancelSegment(cuid);
|
||||
}
|
||||
prepareForNextAction(command);
|
||||
e->noWait = true;
|
||||
} catch(Exception* e) {
|
||||
delete command;
|
||||
throw;
|
||||
|
|
|
@ -41,7 +41,7 @@ namespace aria2 {
|
|||
bool RealtimeCommand::execute()
|
||||
{
|
||||
setStatusRealtime();
|
||||
_e->noWait = true;
|
||||
_e->setNoWait(true);
|
||||
try {
|
||||
return executeInternal();
|
||||
} catch(Exception* e) {
|
||||
|
|
|
@ -460,6 +460,8 @@ Commands RequestGroup::createNextCommand(DownloadEngine* e, unsigned int numComm
|
|||
Command* command = InitiateConnectionCommandFactory::createInitiateConnectionCommand(CUIDCounterSingletonHolder::instance()->newID(), req, this, e);
|
||||
ServerHostHandle sv(new ServerHost(command->getCuid(), req->getHost()));
|
||||
registerServerHost(sv);
|
||||
// give a chance to be executed in the next loop in DownloadEngine
|
||||
command->setStatus(Command::STATUS_ONESHOT_REALTIME);
|
||||
commands.push_back(command);
|
||||
} else {
|
||||
pendingURIs.push_front(uri);
|
||||
|
|
|
@ -166,6 +166,7 @@ void RequestGroupMan::fillRequestGroupFromReserver(DownloadEngine* e)
|
|||
}
|
||||
std::copy(temp.begin(), temp.end(), std::front_inserter(_reservedGroups));
|
||||
if(count > 0) {
|
||||
e->setNoWait(true);
|
||||
_logger->debug("%d RequestGroup(s) added.", count);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -57,6 +57,8 @@ Commands StreamFileAllocationEntry::prepareForNextAction(DownloadEngine* e)
|
|||
{
|
||||
Commands commands;
|
||||
if(_nextCommand) {
|
||||
// give _nextCommand a chance to execute in the next execution loop.
|
||||
_nextCommand->setStatus(Command::STATUS_ONESHOT_REALTIME);
|
||||
commands.push_back(popNextCommand());
|
||||
// try remaining uris
|
||||
Commands streamCommands = _requestGroup->createNextCommandWithAdj(e, -1);
|
||||
|
|
|
@ -37,8 +37,11 @@
|
|||
|
||||
namespace aria2 {
|
||||
|
||||
TimeBasedCommand::TimeBasedCommand(int32_t cuid, DownloadEngine* e, time_t interval):
|
||||
Command(cuid), _e(e),_exit(false), _interval(interval) {}
|
||||
TimeBasedCommand::TimeBasedCommand(int32_t cuid, DownloadEngine* e,
|
||||
time_t interval,
|
||||
bool routineCommand):
|
||||
Command(cuid), _e(e),_exit(false), _interval(interval),
|
||||
_routineCommand(routineCommand) {}
|
||||
|
||||
TimeBasedCommand::~TimeBasedCommand() {}
|
||||
|
||||
|
@ -59,7 +62,11 @@ bool TimeBasedCommand::execute()
|
|||
if(_exit) {
|
||||
return true;
|
||||
}
|
||||
_e->commands.push_back(this);
|
||||
if(_routineCommand) {
|
||||
_e->addRoutineCommand(this);
|
||||
} else {
|
||||
_e->commands.push_back(this);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -57,6 +57,8 @@ protected:
|
|||
bool _exit;
|
||||
|
||||
time_t _interval; // unit: sec
|
||||
|
||||
bool _routineCommand;
|
||||
private:
|
||||
Time _checkPoint;
|
||||
public:
|
||||
|
@ -77,7 +79,8 @@ public:
|
|||
virtual void postProcess() {};
|
||||
|
||||
public:
|
||||
TimeBasedCommand(int32_t cuid, DownloadEngine* e, time_t interval);
|
||||
TimeBasedCommand(int32_t cuid, DownloadEngine* e, time_t interval,
|
||||
bool routineCommand = false);
|
||||
|
||||
virtual ~TimeBasedCommand();
|
||||
|
||||
|
|
|
@ -42,7 +42,7 @@ namespace aria2 {
|
|||
|
||||
TimedHaltCommand::TimedHaltCommand(int32_t cuid, DownloadEngine* e,
|
||||
time_t secondsToHalt):
|
||||
TimeBasedCommand(cuid, e, secondsToHalt) {}
|
||||
TimeBasedCommand(cuid, e, secondsToHalt, true) {}
|
||||
|
||||
TimedHaltCommand::~TimedHaltCommand() {}
|
||||
|
||||
|
|
Loading…
Reference in New Issue