2008-02-11 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>

Added the ability to stop aria2 itself when given time has 
passed
	from start. Use --stop option to specify time in minutes.
	When 0 is given, this feature is disabled.
	* src/OptionHandlerFactory.cc
	* src/TimeBasedCommand.h: Make _interval protected scope.
	* src/HelpItemFactory.cc
	* src/option_processing.cc
	* src/prefs.h
	* src/FillRequestGroupCommand.cc: Evaluate _e->isHaltRequested()
	before calling RequestGroupMan::fillRequestGroupFromReserver().
	Without this modification, the result list shows "ERR" when 
aria2 is
	stopped by --stop option. It should be "INPR".
	* src/DownloadEngine.{h, cc}
	* src/DownloadEngineFactory.cc
	* src/usage_text.h
	* src/TimedHaltCommand.{h, cc}: New class.
pull/1/head
Tatsuhiro Tsujikawa 2008-02-11 05:07:08 +00:00
parent 5d6f1c046a
commit 9c277148b9
15 changed files with 189 additions and 18 deletions

View File

@ -1,3 +1,22 @@
2008-02-11 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Added the ability to stop aria2 itself when given time has passed
from start. Use --stop option to specify time in minutes.
When 0 is given, this feature is disabled.
* src/OptionHandlerFactory.cc
* src/TimeBasedCommand.h: Make _interval protected scope.
* src/HelpItemFactory.cc
* src/option_processing.cc
* src/prefs.h
* src/FillRequestGroupCommand.cc: Evaluate _e->isHaltRequested()
before calling RequestGroupMan::fillRequestGroupFromReserver().
Without this modification, the result list shows "ERR" when aria2 is
stopped by --stop option. It should be "INPR".
* src/DownloadEngine.{h, cc}
* src/DownloadEngineFactory.cc
* src/usage_text.h
* src/TimedHaltCommand.{h, cc}: New class.
2008-02-11 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com> 2008-02-11 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Bootstrap through node added by port message. Bootstrap through node added by port message.

View File

@ -293,8 +293,7 @@ void DownloadEngine::afterEachIteration()
{ {
if(globalHaltRequested == 1) { if(globalHaltRequested == 1) {
logger->notice(_("Shutdown sequence commencing... Press Ctrl-C again for emergency shutdown.")); logger->notice(_("Shutdown sequence commencing... Press Ctrl-C again for emergency shutdown."));
_haltRequested = true; requestHalt();
_requestGroupMan->halt();
globalHaltRequested = 2; globalHaltRequested = 2;
} else if(globalHaltRequested == 3) { } else if(globalHaltRequested == 3) {
logger->notice(_("Emergency shutdown sequence commencing...")); logger->notice(_("Emergency shutdown sequence commencing..."));
@ -303,6 +302,12 @@ void DownloadEngine::afterEachIteration()
} }
} }
void DownloadEngine::requestHalt()
{
_haltRequested = true;
_requestGroupMan->halt();
}
void DownloadEngine::fillCommand() void DownloadEngine::fillCommand()
{ {
addCommand(_requestGroupMan->getInitialCommands(this)); addCommand(_requestGroupMan->getInitialCommands(this));

View File

@ -161,6 +161,8 @@ public:
{ {
return _haltRequested; return _haltRequested;
} }
void requestHalt();
}; };
typedef SharedHandle<DownloadEngine> DownloadEngineHandle; typedef SharedHandle<DownloadEngine> DownloadEngineHandle;

View File

@ -49,6 +49,7 @@
#include "FileAllocationDispatcherCommand.h" #include "FileAllocationDispatcherCommand.h"
#include "AutoSaveCommand.h" #include "AutoSaveCommand.h"
#include "HaveEraseCommand.h" #include "HaveEraseCommand.h"
#include "TimedHaltCommand.h"
#include "DownloadResult.h" #include "DownloadResult.h"
#include <algorithm> #include <algorithm>
@ -86,7 +87,12 @@ DownloadEngineFactory::newDownloadEngine(Option* op,
e->commands.push_back(new FileAllocationDispatcherCommand(CUIDCounterSingletonHolder::instance()->newID(), e.get())); 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 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->commands.push_back(new HaveEraseCommand(CUIDCounterSingletonHolder::instance()->newID(), e.get(), 10));
{
int32_t stopMin = op->getAsInt(PREF_STOP);
if(stopMin > 0) {
e->commands.push_back(new TimedHaltCommand(CUIDCounterSingletonHolder::instance()->newID(), e.get(), stopMin*60));
}
}
return e; return e;
} }

View File

@ -56,13 +56,16 @@ FillRequestGroupCommand::~FillRequestGroupCommand() {}
bool FillRequestGroupCommand::execute() bool FillRequestGroupCommand::execute()
{ {
if(_e->isHaltRequested()) {
return true;
}
try { try {
_e->_requestGroupMan->fillRequestGroupFromReserver(_e); _e->_requestGroupMan->fillRequestGroupFromReserver(_e);
} catch(RecoverableException* ex) { } catch(RecoverableException* ex) {
logger->error(EX_EXCEPTION_CAUGHT, ex); logger->error(EX_EXCEPTION_CAUGHT, ex);
delete ex; delete ex;
} }
if(_e->_requestGroupMan->downloadFinished() || _e->isHaltRequested()) { if(_e->_requestGroupMan->downloadFinished()) {
return true; return true;
} }
_e->commands.push_back(this); _e->commands.push_back(this);

View File

@ -415,6 +415,11 @@ TagContainerHandle HelpItemFactory::createHelpItems()
item->addTag(TAG_ADVANCED); item->addTag(TAG_ADVANCED);
tc->addItem(item); tc->addItem(item);
} }
{
HelpItemHandle item = new HelpItem(PREF_STOP, TEXT_STOP, "0");
item->addTag(TAG_ADVANCED);
tc->addItem(item);
}
{ {
HelpItemHandle item = new HelpItem("help", TEXT_HELP, TAG_BASIC); HelpItemHandle item = new HelpItem("help", TEXT_HELP, TAG_BASIC);
char buf[64]; char buf[64];

View File

@ -155,7 +155,8 @@ SRCS = Socket.h\
TaggedItem.cc\ TaggedItem.cc\
TagContainer.cc\ TagContainer.cc\
HelpItemFactory.cc\ HelpItemFactory.cc\
SingleFileDownloadContext.cc SingleFileDownloadContext.cc\
TimedHaltCommand.cc
# debug_new.cpp # debug_new.cpp
if ENABLE_MESSAGE_DIGEST if ENABLE_MESSAGE_DIGEST

View File

@ -356,7 +356,7 @@ am__libaria2c_a_SOURCES_DIST = Socket.h SocketCore.cc SocketCore.h \
ByteArrayDiskWriter.h ByteArrayDiskWriterFactory.cc \ ByteArrayDiskWriter.h ByteArrayDiskWriterFactory.cc \
ServerHost.cc HelpItem.cc TaggedItem.cc TagContainer.cc \ ServerHost.cc HelpItem.cc TaggedItem.cc TagContainer.cc \
HelpItemFactory.cc SingleFileDownloadContext.cc \ HelpItemFactory.cc SingleFileDownloadContext.cc \
IteratableChunkChecksumValidator.cc \ TimedHaltCommand.cc IteratableChunkChecksumValidator.cc \
IteratableChunkChecksumValidator.h \ IteratableChunkChecksumValidator.h \
IteratableChecksumValidator.cc IteratableChecksumValidator.h \ IteratableChecksumValidator.cc IteratableChecksumValidator.h \
CheckIntegrityCommand.cc CheckIntegrityCommand.h \ CheckIntegrityCommand.cc CheckIntegrityCommand.h \
@ -676,11 +676,11 @@ am__objects_14 = SocketCore.$(OBJEXT) Command.$(OBJEXT) \
ByteArrayDiskWriterFactory.$(OBJEXT) ServerHost.$(OBJEXT) \ ByteArrayDiskWriterFactory.$(OBJEXT) ServerHost.$(OBJEXT) \
HelpItem.$(OBJEXT) TaggedItem.$(OBJEXT) TagContainer.$(OBJEXT) \ HelpItem.$(OBJEXT) TaggedItem.$(OBJEXT) TagContainer.$(OBJEXT) \
HelpItemFactory.$(OBJEXT) SingleFileDownloadContext.$(OBJEXT) \ HelpItemFactory.$(OBJEXT) SingleFileDownloadContext.$(OBJEXT) \
$(am__objects_1) $(am__objects_2) $(am__objects_3) \ TimedHaltCommand.$(OBJEXT) $(am__objects_1) $(am__objects_2) \
$(am__objects_4) $(am__objects_5) $(am__objects_6) \ $(am__objects_3) $(am__objects_4) $(am__objects_5) \
$(am__objects_7) $(am__objects_8) $(am__objects_9) \ $(am__objects_6) $(am__objects_7) $(am__objects_8) \
$(am__objects_10) $(am__objects_11) $(am__objects_12) \ $(am__objects_9) $(am__objects_10) $(am__objects_11) \
$(am__objects_13) $(am__objects_12) $(am__objects_13)
am_libaria2c_a_OBJECTS = $(am__objects_14) am_libaria2c_a_OBJECTS = $(am__objects_14)
libaria2c_a_OBJECTS = $(am_libaria2c_a_OBJECTS) libaria2c_a_OBJECTS = $(am_libaria2c_a_OBJECTS)
am__installdirs = "$(DESTDIR)$(bindir)" am__installdirs = "$(DESTDIR)$(bindir)"
@ -1003,11 +1003,11 @@ SRCS = Socket.h SocketCore.cc SocketCore.h Command.cc Command.h \
ByteArrayDiskWriter.h ByteArrayDiskWriterFactory.cc \ ByteArrayDiskWriter.h ByteArrayDiskWriterFactory.cc \
ServerHost.cc HelpItem.cc TaggedItem.cc TagContainer.cc \ ServerHost.cc HelpItem.cc TaggedItem.cc TagContainer.cc \
HelpItemFactory.cc SingleFileDownloadContext.cc \ HelpItemFactory.cc SingleFileDownloadContext.cc \
$(am__append_1) $(am__append_2) $(am__append_3) \ TimedHaltCommand.cc $(am__append_1) $(am__append_2) \
$(am__append_4) $(am__append_5) $(am__append_6) \ $(am__append_3) $(am__append_4) $(am__append_5) \
$(am__append_7) $(am__append_8) $(am__append_9) \ $(am__append_6) $(am__append_7) $(am__append_8) \
$(am__append_10) $(am__append_11) $(am__append_12) \ $(am__append_9) $(am__append_10) $(am__append_11) \
$(am__append_13) $(am__append_12) $(am__append_13)
noinst_LIBRARIES = libaria2c.a noinst_LIBRARIES = libaria2c.a
libaria2c_a_SOURCES = $(SRCS) libaria2c_a_SOURCES = $(SRCS)
aria2c_LDADD = libaria2c.a @LIBINTL@ @ALLOCA@ @LIBGNUTLS_LIBS@\ aria2c_LDADD = libaria2c.a @LIBINTL@ @ALLOCA@ @LIBGNUTLS_LIBS@\
@ -1341,6 +1341,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TaggedItem.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TaggedItem.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TimeA2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TimeA2.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TimeBasedCommand.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TimeBasedCommand.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TimedHaltCommand.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TrackerWatcherCommand.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TrackerWatcherCommand.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TransferStat.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TransferStat.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/URLMetalinkParserState.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/URLMetalinkParserState.Po@am__quote@

View File

@ -118,7 +118,8 @@ OptionHandlers OptionHandlerFactory::createOptionHandlers()
handlers.push_back(new HostPortOptionHandler(PREF_DHT_ENTRY_POINT, handlers.push_back(new HostPortOptionHandler(PREF_DHT_ENTRY_POINT,
PREF_DHT_ENTRY_POINT_HOST, PREF_DHT_ENTRY_POINT_HOST,
PREF_DHT_ENTRY_POINT_PORT)); PREF_DHT_ENTRY_POINT_PORT));
handlers.push_back(new NumberOptionHandler(PREF_STOP, 0, 35000000));
return handlers; return handlers;
} }

View File

@ -55,8 +55,9 @@ protected:
* true. * true.
*/ */
bool _exit; bool _exit;
private:
int32_t _interval; // unit: sec int32_t _interval; // unit: sec
private:
Time _checkPoint; Time _checkPoint;
public: public:
/** /**

63
src/TimedHaltCommand.cc Normal file
View File

@ -0,0 +1,63 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#include "TimedHaltCommand.h"
#include "DownloadEngine.h"
#include "RequestGroupMan.h"
#include "Logger.h"
namespace aria2 {
TimedHaltCommand::TimedHaltCommand(int32_t cuid, DownloadEngine* e,
int32_t secondsToHalt):
TimeBasedCommand(cuid, e, secondsToHalt) {}
TimedHaltCommand::~TimedHaltCommand() {}
void TimedHaltCommand::preProcess()
{
if(_e->_requestGroupMan->downloadFinished() || _e->isHaltRequested()) {
_exit = true;
}
}
void TimedHaltCommand::process()
{
if(!_e->isHaltRequested()) {
logger->notice("%d minutes passed. Stopping application.", _interval/60);
_e->requestHalt();
}
}
} // namespace aria2

55
src/TimedHaltCommand.h Normal file
View File

@ -0,0 +1,55 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#ifndef _D_TIMED_HALT_COMMAND_H_
#define _D_TIMED_HALT_COMMAND_H_
#include "TimeBasedCommand.h"
namespace aria2 {
class TimedHaltCommand:public TimeBasedCommand {
public:
TimedHaltCommand(int32_t cuid, DownloadEngine* e, int32_t secondsToHalt);
virtual ~TimedHaltCommand();
virtual void preProcess();
virtual void process();
};
} // namespace aria2
#endif // _D_TIMED_HALT_COMMAND_H_

View File

@ -200,6 +200,7 @@ Option* option_processing(int argc, char* const argv[])
{ PREF_ALLOW_PIECE_LENGTH_CHANGE, required_argument, &lopt, 211 }, { PREF_ALLOW_PIECE_LENGTH_CHANGE, required_argument, &lopt, 211 },
{ PREF_NO_CONF, no_argument, &lopt, 212 }, { PREF_NO_CONF, no_argument, &lopt, 212 },
{ PREF_CONF_PATH, required_argument, &lopt, 213 }, { PREF_CONF_PATH, required_argument, &lopt, 213 },
{ PREF_STOP, required_argument, &lopt, 214 },
#if defined ENABLE_BITTORRENT || ENABLE_METALINK #if defined ENABLE_BITTORRENT || ENABLE_METALINK
{ "show-files", no_argument, NULL, 'S' }, { "show-files", no_argument, NULL, 'S' },
{ "select-file", required_argument, &lopt, 21 }, { "select-file", required_argument, &lopt, 21 },
@ -387,6 +388,9 @@ Option* option_processing(int argc, char* const argv[])
case 213: case 213:
ucfname = optarg; ucfname = optarg;
break; break;
case 214:
cmdstream << PREF_STOP << "=" << optarg << "\n";
break;
} }
break; break;
} }

View File

@ -124,6 +124,8 @@
#define PREF_NO_CONF "no-conf" #define PREF_NO_CONF "no-conf"
// value: string // value: string
#define PREF_CONF_PATH "conf-path" #define PREF_CONF_PATH "conf-path"
// value: 1*digit
#define PREF_STOP "stop"
/** /**
* FTP related preferences * FTP related preferences

View File

@ -317,3 +317,6 @@ _(" -h, --help[=CATEGORY] Print usage and exit.\n"\
_(" --no-conf Disable loading aria2.conf file.") _(" --no-conf Disable loading aria2.conf file.")
#define TEXT_CONF_PATH \ #define TEXT_CONF_PATH \
_(" --conf-path=PATH Change the configuration file path to PATH.") _(" --conf-path=PATH Change the configuration file path to PATH.")
#define TEXT_STOP \
_(" --stop=MINUTES Stop application after MINUTES minutes has passed.\n" \
" If 0 is given, this feature is disabled.")