mirror of https://github.com/aria2/aria2
2010-06-20 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Use auto_delete_container to delete created Command when exception is thrown rather than deleting them in catch block. * src/AbstractCommand.cc * src/CheckIntegrityCommand.cc * src/DHTSetup.cc * src/FileAllocationCommand.cc * src/TrackerWatcherCommand.cc * src/a2functional.hpull/1/head
parent
cb4e25e4b4
commit
0f0fc5f198
11
ChangeLog
11
ChangeLog
|
@ -1,3 +1,14 @@
|
|||
2010-06-20 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
|
||||
|
||||
Use auto_delete_container to delete created Command when exception
|
||||
is thrown rather than deleting them in catch block.
|
||||
* src/AbstractCommand.cc
|
||||
* src/CheckIntegrityCommand.cc
|
||||
* src/DHTSetup.cc
|
||||
* src/FileAllocationCommand.cc
|
||||
* src/TrackerWatcherCommand.cc
|
||||
* src/a2functional.h
|
||||
|
||||
2010-06-20 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
|
||||
|
||||
Removed BDE and bencode
|
||||
|
|
|
@ -722,14 +722,11 @@ void AbstractCommand::prepareForNextAction(Command* nextCommand)
|
|||
SharedHandle<CheckIntegrityEntry> entry
|
||||
(new StreamCheckIntegrityEntry(_requestGroup, nextCommand));
|
||||
|
||||
std::vector<Command*> commands;
|
||||
try {
|
||||
_requestGroup->processCheckIntegrityEntry(commands, entry, _e);
|
||||
} catch(RecoverableException& e) {
|
||||
std::for_each(commands.begin(), commands.end(), Deleter());
|
||||
throw;
|
||||
}
|
||||
_e->addCommand(commands);
|
||||
std::vector<Command*>* commands = new std::vector<Command*>();
|
||||
auto_delete_container<std::vector<Command*> > commandsDel(commands);
|
||||
_requestGroup->processCheckIntegrityEntry(*commands, entry, _e);
|
||||
_e->addCommand(*commands);
|
||||
commands->clear();
|
||||
_e->setNoWait(true);
|
||||
}
|
||||
|
||||
|
|
|
@ -75,26 +75,20 @@ bool CheckIntegrityCommand::executeInternal()
|
|||
getLogger()->notice
|
||||
(MSG_VERIFICATION_SUCCESSFUL,
|
||||
getRequestGroup()->getDownloadContext()->getBasePath().c_str());
|
||||
std::vector<Command*> commands;
|
||||
try {
|
||||
_entry->onDownloadFinished(commands, getDownloadEngine());
|
||||
} catch(RecoverableException& e) {
|
||||
std::for_each(commands.begin(), commands.end(), Deleter());
|
||||
throw;
|
||||
}
|
||||
getDownloadEngine()->addCommand(commands);
|
||||
std::vector<Command*>* commands = new std::vector<Command*>();
|
||||
auto_delete_container<std::vector<Command*> > commandsDel(commands);
|
||||
_entry->onDownloadFinished(*commands, getDownloadEngine());
|
||||
getDownloadEngine()->addCommand(*commands);
|
||||
commands->clear();
|
||||
} else {
|
||||
getLogger()->error
|
||||
(MSG_VERIFICATION_FAILED,
|
||||
getRequestGroup()->getDownloadContext()->getBasePath().c_str());
|
||||
std::vector<Command*> commands;
|
||||
try {
|
||||
_entry->onDownloadIncomplete(commands, getDownloadEngine());
|
||||
} catch(RecoverableException& e) {
|
||||
std::for_each(commands.begin(), commands.end(), Deleter());
|
||||
throw;
|
||||
}
|
||||
getDownloadEngine()->addCommand(commands);
|
||||
std::vector<Command*>* commands = new std::vector<Command*>();
|
||||
auto_delete_container<std::vector<Command*> > commandsDel(commands);
|
||||
_entry->onDownloadIncomplete(*commands, getDownloadEngine());
|
||||
getDownloadEngine()->addCommand(*commands);
|
||||
commands->clear();
|
||||
}
|
||||
getDownloadEngine()->setNoWait(true);
|
||||
return true;
|
||||
|
|
|
@ -91,8 +91,9 @@ void DHTSetup::setup(std::vector<Command*>& commands, DownloadEngine* e)
|
|||
if(_initialized) {
|
||||
return;
|
||||
}
|
||||
std::vector<Command*> tempCommands;
|
||||
try {
|
||||
std::vector<Command*>* tempCommands = new std::vector<Command*>();
|
||||
auto_delete_container<std::vector<Command*> > commandsDel(tempCommands);
|
||||
// load routing table and localnode id here
|
||||
|
||||
SharedHandle<DHTNode> localNode;
|
||||
|
@ -219,7 +220,7 @@ void DHTSetup::setup(std::vector<Command*>& commands, DownloadEngine* e)
|
|||
command->setTaskFactory(taskFactory);
|
||||
command->setRoutingTable(routingTable);
|
||||
command->setLocalNode(localNode);
|
||||
tempCommands.push_back(command);
|
||||
tempCommands->push_back(command);
|
||||
}
|
||||
} else {
|
||||
_logger->info("No DHT entry point specified.");
|
||||
|
@ -231,13 +232,13 @@ void DHTSetup::setup(std::vector<Command*>& commands, DownloadEngine* e)
|
|||
command->setMessageReceiver(receiver);
|
||||
command->setTaskQueue(taskQueue);
|
||||
command->setReadCheckSocket(connection->getSocket());
|
||||
tempCommands.push_back(command);
|
||||
tempCommands->push_back(command);
|
||||
}
|
||||
{
|
||||
DHTTokenUpdateCommand* command =
|
||||
new DHTTokenUpdateCommand(e->newCUID(), e, DHT_TOKEN_UPDATE_INTERVAL);
|
||||
command->setTokenTracker(tokenTracker);
|
||||
tempCommands.push_back(command);
|
||||
tempCommands->push_back(command);
|
||||
}
|
||||
{
|
||||
DHTBucketRefreshCommand* command =
|
||||
|
@ -246,28 +247,29 @@ void DHTSetup::setup(std::vector<Command*>& commands, DownloadEngine* e)
|
|||
command->setTaskQueue(taskQueue);
|
||||
command->setRoutingTable(routingTable);
|
||||
command->setTaskFactory(taskFactory);
|
||||
tempCommands.push_back(command);
|
||||
tempCommands->push_back(command);
|
||||
}
|
||||
{
|
||||
DHTPeerAnnounceCommand* command =
|
||||
new DHTPeerAnnounceCommand(e->newCUID(), e,
|
||||
DHT_PEER_ANNOUNCE_CHECK_INTERVAL);
|
||||
command->setPeerAnnounceStorage(peerAnnounceStorage);
|
||||
tempCommands.push_back(command);
|
||||
tempCommands->push_back(command);
|
||||
}
|
||||
{
|
||||
DHTAutoSaveCommand* command =
|
||||
new DHTAutoSaveCommand(e->newCUID(), e, 30*60);
|
||||
command->setLocalNode(localNode);
|
||||
command->setRoutingTable(routingTable);
|
||||
tempCommands.push_back(command);
|
||||
tempCommands->push_back(command);
|
||||
}
|
||||
_initialized = true;
|
||||
commands.insert(commands.end(), tempCommands.begin(), tempCommands.end());
|
||||
commands.insert(commands.end(), tempCommands->begin(), tempCommands->end());
|
||||
tempCommands->clear();
|
||||
} catch(RecoverableException& e) {
|
||||
_logger->error("Exception caught while initializing DHT functionality. DHT is disabled.", e);
|
||||
_logger->error("Exception caught while initializing DHT functionality."
|
||||
" DHT is disabled.", e);
|
||||
DHTRegistry::clearData();
|
||||
std::for_each(tempCommands.begin(), tempCommands.end(), Deleter());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -76,14 +76,11 @@ bool FileAllocationCommand::executeInternal()
|
|||
}
|
||||
getDownloadEngine()->getFileAllocationMan()->dropPickedEntry();
|
||||
|
||||
std::vector<Command*> commands;
|
||||
try {
|
||||
_fileAllocationEntry->prepareForNextAction(commands, getDownloadEngine());
|
||||
} catch(RecoverableException& e) {
|
||||
std::for_each(commands.begin(), commands.end(), Deleter());
|
||||
throw;
|
||||
}
|
||||
getDownloadEngine()->addCommand(commands);
|
||||
std::vector<Command*>* commands = new std::vector<Command*>();
|
||||
auto_delete_container<std::vector<Command*> > commandsDel(commands);
|
||||
_fileAllocationEntry->prepareForNextAction(*commands, getDownloadEngine());
|
||||
getDownloadEngine()->addCommand(*commands);
|
||||
commands->clear();
|
||||
getDownloadEngine()->setNoWait(true);
|
||||
return true;
|
||||
} else {
|
||||
|
|
|
@ -104,17 +104,17 @@ bool TrackerWatcherCommand::execute() {
|
|||
if(_trackerRequestGroup.isNull()) {
|
||||
_trackerRequestGroup = createAnnounce();
|
||||
if(!_trackerRequestGroup.isNull()) {
|
||||
std::vector<Command*> commands;
|
||||
try {
|
||||
_trackerRequestGroup->createInitialCommand(commands, _e);
|
||||
std::vector<Command*>* commands = new std::vector<Command*>();
|
||||
auto_delete_container<std::vector<Command*> > commandsDel(commands);
|
||||
_trackerRequestGroup->createInitialCommand(*commands, _e);
|
||||
_e->addCommand(*commands);
|
||||
commands->clear();
|
||||
if(getLogger()->debug()) {
|
||||
getLogger()->debug("added tracker request command");
|
||||
}
|
||||
} catch(RecoverableException& ex) {
|
||||
getLogger()->error(EX_EXCEPTION_CAUGHT, ex);
|
||||
std::for_each(commands.begin(), commands.end(), Deleter());
|
||||
commands.clear();
|
||||
}
|
||||
_e->addCommand(commands);
|
||||
if(getLogger()->debug()) {
|
||||
getLogger()->debug("added tracker request command");
|
||||
}
|
||||
}
|
||||
} else if(_trackerRequestGroup->downloadFinished()){
|
||||
|
|
|
@ -36,9 +36,11 @@
|
|||
#define _D_A2_FUNCTIONAL_H_
|
||||
|
||||
#include <functional>
|
||||
#include <string>
|
||||
#include <algorithm>
|
||||
|
||||
#include "SharedHandle.h"
|
||||
#include "A2STR.h"
|
||||
#include <string>
|
||||
|
||||
namespace aria2 {
|
||||
|
||||
|
@ -204,6 +206,20 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
template<class Container>
|
||||
class auto_delete_container {
|
||||
private:
|
||||
Container* _c;
|
||||
public:
|
||||
auto_delete_container(Container* c):_c(c) {}
|
||||
|
||||
~auto_delete_container()
|
||||
{
|
||||
std::for_each(_c->begin(), _c->end(), Deleter());
|
||||
delete _c;
|
||||
}
|
||||
};
|
||||
|
||||
template<typename InputIterator, typename DelimiterType>
|
||||
std::string strjoin(InputIterator first, InputIterator last,
|
||||
const DelimiterType& delim)
|
||||
|
|
Loading…
Reference in New Issue