diff options
| -rw-r--r-- | ChangeLog | 11 | ||||
| -rw-r--r-- | src/FillRequestGroupCommand.cc | 19 | ||||
| -rw-r--r-- | src/RequestGroup.cc | 7 | ||||
| -rw-r--r-- | src/RequestGroup.h | 8 | ||||
| -rw-r--r-- | src/RequestGroupMan.cc | 4 | ||||
| -rw-r--r-- | src/RequestGroupMan.h | 20 |
6 files changed, 61 insertions, 8 deletions
@@ -1,5 +1,16 @@ 2010-03-05 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net> + Only execute RequestGroupMan::fillRequestGroupFromReserver() when + queue maintenance is requested by RequestGroup to avoid to call + the function unnecessarily. + * src/FillRequestGroupCommand.cc + * src/RequestGroup.cc + * src/RequestGroup.h + * src/RequestGroupMan.cc + * src/RequestGroupMan.h + +2010-03-05 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net> + Don't use hash for Peer::id. Simple concatenation of ip address and port is enough. * src/Peer.cc diff --git a/src/FillRequestGroupCommand.cc b/src/FillRequestGroupCommand.cc index 7681c5db..13d53c7f 100644 --- a/src/FillRequestGroupCommand.cc +++ b/src/FillRequestGroupCommand.cc @@ -40,6 +40,7 @@ #include "message.h" #include "Logger.h" #include "DownloadContext.h" +#include "ServerStatMan.h" namespace aria2 { @@ -60,13 +61,17 @@ bool FillRequestGroupCommand::execute() if(_e->isHaltRequested()) { return true; } - try { - _e->_requestGroupMan->fillRequestGroupFromReserver(_e); - } catch(RecoverableException& ex) { - logger->error(EX_EXCEPTION_CAUGHT, ex); - } - if(_e->_requestGroupMan->downloadFinished()) { - return true; + SharedHandle<RequestGroupMan> rgman = _e->_requestGroupMan; + if(rgman->queueCheckRequested()) { + try { + rgman->fillRequestGroupFromReserver(_e); + rgman->clearQueueCheck(); + } catch(RecoverableException& ex) { + logger->error(EX_EXCEPTION_CAUGHT, ex); + } + if(rgman->downloadFinished()) { + return true; + } } _e->addRoutineCommand(this); return false; diff --git a/src/RequestGroup.cc b/src/RequestGroup.cc index 275cd164..c2a0f092 100644 --- a/src/RequestGroup.cc +++ b/src/RequestGroup.cc @@ -130,6 +130,7 @@ RequestGroup::RequestGroup(const SharedHandle<Option>& option): _maxDownloadSpeedLimit(option->getAsInt(PREF_MAX_DOWNLOAD_LIMIT)), _maxUploadSpeedLimit(option->getAsInt(PREF_MAX_UPLOAD_LIMIT)), _belongsToGID(0), + _requestGroupMan(0), _logger(LogFactory::getInstance()) { _fileAllocationEnabled = _option->get(PREF_FILE_ALLOCATION) != V_NONE; @@ -799,6 +800,12 @@ void RequestGroup::increaseNumCommand() void RequestGroup::decreaseNumCommand() { --_numCommand; + if(!_numCommand && _requestGroupMan) { + if(_logger->debug()) { + _logger->debug("GID#%d - Request queue check", _gid); + } + _requestGroupMan->requestQueueCheck(); + } } diff --git a/src/RequestGroup.h b/src/RequestGroup.h index d7672b82..bef34b84 100644 --- a/src/RequestGroup.h +++ b/src/RequestGroup.h @@ -67,6 +67,7 @@ class CheckIntegrityEntry; class DownloadResult; class URISelector; class URIResult; +class RequestGroupMan; #ifdef ENABLE_BITTORRENT class BtRuntime; class PeerStorage; @@ -162,6 +163,8 @@ private: // RequestGroup. int32_t _belongsToGID; + RequestGroupMan* _requestGroupMan; + Logger* _logger; void validateFilename(const std::string& expectedFilename, @@ -488,6 +491,11 @@ public: return _belongsToGID; } + void setRequestGroupMan(RequestGroupMan* requestGroupMan) + { + _requestGroupMan = requestGroupMan; + } + static void resetGIDCounter() { _gidCounter = 0; } static int32_t newGID(); diff --git a/src/RequestGroupMan.cc b/src/RequestGroupMan.cc index 442ecf6d..bf9a9206 100644 --- a/src/RequestGroupMan.cc +++ b/src/RequestGroupMan.cc @@ -83,7 +83,8 @@ RequestGroupMan::RequestGroupMan _maxOverallDownloadSpeedLimit (option->getAsInt(PREF_MAX_OVERALL_DOWNLOAD_LIMIT)), _maxOverallUploadSpeedLimit(option->getAsInt(PREF_MAX_OVERALL_UPLOAD_LIMIT)), - _xmlRpc(option->getAsBool(PREF_ENABLE_XML_RPC)) + _xmlRpc(option->getAsBool(PREF_ENABLE_XML_RPC)), + _queueCheck(true) {} bool RequestGroupMan::downloadFinished() @@ -497,6 +498,7 @@ void RequestGroupMan::fillRequestGroupFromReserver(DownloadEngine* e) } configureRequestGroup(groupToAdd); createInitialCommand(groupToAdd, commands, e); + groupToAdd->setRequestGroupMan(this); _requestGroups.push_back(groupToAdd); ++count; e->addCommand(commands); diff --git a/src/RequestGroupMan.h b/src/RequestGroupMan.h index 6f63ca92..df112794 100644 --- a/src/RequestGroupMan.h +++ b/src/RequestGroupMan.h @@ -77,6 +77,8 @@ private: // truf if XML-RPC is enabled. bool _xmlRpc; + bool _queueCheck; + std::string formatDownloadResult(const std::string& status, const SharedHandle<DownloadResult>& downloadResult) const; @@ -254,6 +256,24 @@ public: { _maxSimultaneousDownloads = max; } + + // Call this function if _requestGroups queue should be maintained. + // This function is added to reduce the call of maintenance, but at + // the same time, it provides fast maintenance reaction. + void requestQueueCheck() + { + _queueCheck = true; + } + + void clearQueueCheck() + { + _queueCheck = false; + } + + bool queueCheckRequested() const + { + return _queueCheck; + } }; typedef SharedHandle<RequestGroupMan> RequestGroupManHandle; |
