mirror of https://github.com/aria2/aria2
				
				
				
			Simplified RequestGroupMan::fillRequestGroupFromReserver
							parent
							
								
									b017e80438
								
							
						
					
					
						commit
						616cd9e75f
					
				| 
						 | 
				
			
			@ -43,7 +43,7 @@ class Dependency {
 | 
			
		|||
public:
 | 
			
		||||
  virtual ~Dependency() {}
 | 
			
		||||
 | 
			
		||||
  virtual bool resolve() = 0;
 | 
			
		||||
  virtual bool resolve() = 0; // throw()
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace aria2
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -208,7 +208,11 @@ namespace {
 | 
			
		|||
void notifyDownloadEvent
 | 
			
		||||
(const std::string& event, const SharedHandle<RequestGroup>& group)
 | 
			
		||||
{
 | 
			
		||||
  SingletonHolder<Notifier>::instance()->notifyDownloadEvent(event, group);
 | 
			
		||||
  // Check NULL to make unit test easier.
 | 
			
		||||
  Notifier* notifier = SingletonHolder<Notifier>::instance();
 | 
			
		||||
  if(notifier) {
 | 
			
		||||
    notifier->notifyDownloadEvent(event, group);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace
 | 
			
		||||
| 
						 | 
				
			
			@ -486,6 +490,7 @@ void RequestGroupMan::fillRequestGroupFromReserver(DownloadEngine* e)
 | 
			
		|||
  while(count < num && (uriListParser_ || resitr != reservedGroups_.end())) {
 | 
			
		||||
    if(uriListParser_ && resitr == reservedGroups_.end()) {
 | 
			
		||||
      std::vector<SharedHandle<RequestGroup> > groups;
 | 
			
		||||
      // May throw exception
 | 
			
		||||
      bool ok = createRequestGroupFromUriListParser(groups, option_,
 | 
			
		||||
                                                    uriListParser_.get());
 | 
			
		||||
      if(ok) {
 | 
			
		||||
| 
						 | 
				
			
			@ -501,28 +506,21 @@ void RequestGroupMan::fillRequestGroupFromReserver(DownloadEngine* e)
 | 
			
		|||
    }
 | 
			
		||||
    SharedHandle<RequestGroup> groupToAdd = (*resitr).second;
 | 
			
		||||
    std::vector<Command*> commands;
 | 
			
		||||
    try {
 | 
			
		||||
      if((rpc_ && groupToAdd->isPauseRequested()) ||
 | 
			
		||||
         !groupToAdd->isDependencyResolved()) {
 | 
			
		||||
        ++resitr;
 | 
			
		||||
        continue;
 | 
			
		||||
      }
 | 
			
		||||
    if((rpc_ && groupToAdd->isPauseRequested()) ||
 | 
			
		||||
       !groupToAdd->isDependencyResolved()) {
 | 
			
		||||
      ++resitr;
 | 
			
		||||
      reservedGroups_.erase(groupToAdd->getGID());
 | 
			
		||||
      // Drop pieceStorage here because paused download holds its
 | 
			
		||||
      // reference.
 | 
			
		||||
      groupToAdd->dropPieceStorage();
 | 
			
		||||
      configureRequestGroup(groupToAdd);
 | 
			
		||||
      groupToAdd->setRequestGroupMan(this);
 | 
			
		||||
      continue;
 | 
			
		||||
    }
 | 
			
		||||
    ++resitr;
 | 
			
		||||
    reservedGroups_.erase(groupToAdd->getGID());
 | 
			
		||||
    // Drop pieceStorage here because paused download holds its
 | 
			
		||||
    // reference.
 | 
			
		||||
    groupToAdd->dropPieceStorage();
 | 
			
		||||
    configureRequestGroup(groupToAdd);
 | 
			
		||||
    groupToAdd->setRequestGroupMan(this);
 | 
			
		||||
    try {
 | 
			
		||||
      createInitialCommand(groupToAdd, commands, e);
 | 
			
		||||
      if(commands.empty()) {
 | 
			
		||||
        requestQueueCheck();
 | 
			
		||||
      }
 | 
			
		||||
      groupToAdd->setState(RequestGroup::STATE_ACTIVE);
 | 
			
		||||
      requestGroups_.push_back(groupToAdd->getGID(), groupToAdd);
 | 
			
		||||
      ++count;
 | 
			
		||||
      e->addCommand(commands);
 | 
			
		||||
      commands.clear();
 | 
			
		||||
    } catch(RecoverableException& ex) {
 | 
			
		||||
      A2_LOG_ERROR_EX(EX_EXCEPTION_CAUGHT, ex);
 | 
			
		||||
      A2_LOG_DEBUG("Deleting temporal commands.");
 | 
			
		||||
| 
						 | 
				
			
			@ -530,12 +528,17 @@ void RequestGroupMan::fillRequestGroupFromReserver(DownloadEngine* e)
 | 
			
		|||
      commands.clear();
 | 
			
		||||
      A2_LOG_DEBUG("Commands deleted");
 | 
			
		||||
      groupToAdd->setLastErrorCode(ex.getErrorCode());
 | 
			
		||||
      // We add groupToAdd to e in order to it is processed in
 | 
			
		||||
      // We add groupToAdd to e later in order to it is processed in
 | 
			
		||||
      // removeStoppedGroup().
 | 
			
		||||
      groupToAdd->setState(RequestGroup::STATE_ACTIVE);
 | 
			
		||||
      requestGroups_.push_back(groupToAdd->getGID(), groupToAdd);
 | 
			
		||||
      requestQueueCheck();
 | 
			
		||||
    }
 | 
			
		||||
    if(commands.empty()) {
 | 
			
		||||
      requestQueueCheck();
 | 
			
		||||
    } else {
 | 
			
		||||
      e->addCommand(commands);
 | 
			
		||||
    }
 | 
			
		||||
    groupToAdd->setState(RequestGroup::STATE_ACTIVE);
 | 
			
		||||
    requestGroups_.push_back(groupToAdd->getGID(), groupToAdd);
 | 
			
		||||
 | 
			
		||||
    util::executeHookByOptName(groupToAdd, e->getOption(),
 | 
			
		||||
                               PREF_ON_DOWNLOAD_START);
 | 
			
		||||
    notifyDownloadEvent(Notifier::ON_DOWNLOAD_START, groupToAdd);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,6 +4,7 @@
 | 
			
		|||
 | 
			
		||||
#include <cppunit/extensions/HelperMacros.h>
 | 
			
		||||
 | 
			
		||||
#include "TestUtil.h"
 | 
			
		||||
#include "prefs.h"
 | 
			
		||||
#include "DownloadContext.h"
 | 
			
		||||
#include "RequestGroup.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -16,6 +17,8 @@
 | 
			
		|||
#include "array_fun.h"
 | 
			
		||||
#include "RecoverableException.h"
 | 
			
		||||
#include "util.h"
 | 
			
		||||
#include "DownloadEngine.h"
 | 
			
		||||
#include "SelectEventPoll.h"
 | 
			
		||||
 | 
			
		||||
namespace aria2 {
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -27,13 +30,27 @@ class RequestGroupManTest : public CppUnit::TestFixture {
 | 
			
		|||
  CPPUNIT_TEST(testLoadServerStat);
 | 
			
		||||
  CPPUNIT_TEST(testSaveServerStat);
 | 
			
		||||
  CPPUNIT_TEST(testChangeReservedGroupPosition);
 | 
			
		||||
  CPPUNIT_TEST(testFillRequestGroupFromReserver);
 | 
			
		||||
  CPPUNIT_TEST_SUITE_END();
 | 
			
		||||
private:
 | 
			
		||||
  SharedHandle<DownloadEngine> e_;
 | 
			
		||||
  SharedHandle<Option> option_;
 | 
			
		||||
  SharedHandle<RequestGroupMan> rgman_;
 | 
			
		||||
public:
 | 
			
		||||
  void setUp()
 | 
			
		||||
  {
 | 
			
		||||
    option_.reset(new Option());
 | 
			
		||||
    option_->put(PREF_PIECE_LENGTH, "1048576");
 | 
			
		||||
    // To enable paused RequestGroup
 | 
			
		||||
    option_->put(PREF_ENABLE_RPC, A2_V_TRUE);
 | 
			
		||||
    File(option_->get(PREF_DIR)).mkdirs();
 | 
			
		||||
    e_.reset
 | 
			
		||||
      (new DownloadEngine(SharedHandle<EventPoll>(new SelectEventPoll())));
 | 
			
		||||
    e_->setOption(option_.get());
 | 
			
		||||
    rgman_ = SharedHandle<RequestGroupMan>
 | 
			
		||||
      (new RequestGroupMan(std::vector<SharedHandle<RequestGroup> >(),
 | 
			
		||||
                           3, option_.get()));
 | 
			
		||||
    e_->setRequestGroupMan(rgman_);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void testIsSameFileBeingDownloaded();
 | 
			
		||||
| 
						 | 
				
			
			@ -41,6 +58,7 @@ public:
 | 
			
		|||
  void testLoadServerStat();
 | 
			
		||||
  void testSaveServerStat();
 | 
			
		||||
  void testChangeReservedGroupPosition();
 | 
			
		||||
  void testFillRequestGroupFromReserver();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -190,4 +208,25 @@ void RequestGroupManTest::testChangeReservedGroupPosition()
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RequestGroupManTest::testFillRequestGroupFromReserver()
 | 
			
		||||
{
 | 
			
		||||
  SharedHandle<RequestGroup> rgs[] = {
 | 
			
		||||
    createRequestGroup(0, 0, "foo1", "http://host/foo1", util::copy(option_)),
 | 
			
		||||
    createRequestGroup(0, 0, "foo2", "http://host/foo2", util::copy(option_)),
 | 
			
		||||
    createRequestGroup(0, 0, "foo3", "http://host/foo3", util::copy(option_)),
 | 
			
		||||
    // Intentionally same path/URI for first RequestGroup and set
 | 
			
		||||
    // length explicitly to do duplicate filename check.
 | 
			
		||||
    createRequestGroup(0, 10, "foo1", "http://host/foo1", util::copy(option_)),
 | 
			
		||||
    createRequestGroup(0, 0, "foo4", "http://host/foo4", util::copy(option_)),
 | 
			
		||||
    createRequestGroup(0, 0, "foo5", "http://host/foo5", util::copy(option_))
 | 
			
		||||
  };
 | 
			
		||||
  rgs[1]->setPauseRequested(true);
 | 
			
		||||
  for(SharedHandle<RequestGroup>* i = vbegin(rgs); i != vend(rgs); ++i) {
 | 
			
		||||
    rgman_->addReservedGroup(*i);
 | 
			
		||||
  }
 | 
			
		||||
  rgman_->fillRequestGroupFromReserver(e_.get());
 | 
			
		||||
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL((size_t)2, rgman_->getReservedGroups().size());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace aria2
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -17,6 +17,9 @@
 | 
			
		|||
#include "util.h"
 | 
			
		||||
#include "RequestGroupMan.h"
 | 
			
		||||
#include "RequestGroup.h"
 | 
			
		||||
#include "DownloadContext.h"
 | 
			
		||||
#include "Option.h"
 | 
			
		||||
#include "FileEntry.h"
 | 
			
		||||
#ifdef ENABLE_MESSAGE_DIGEST
 | 
			
		||||
# include "message_digest_helper.h"
 | 
			
		||||
#endif // ENABLE_MESSAGE_DIGEST
 | 
			
		||||
| 
						 | 
				
			
			@ -124,4 +127,21 @@ SharedHandle<RequestGroup> getReservedGroup
 | 
			
		|||
  return (*i).second;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
SharedHandle<RequestGroup> createRequestGroup(int32_t pieceLength,
 | 
			
		||||
                                              int64_t totalLength,
 | 
			
		||||
                                              const std::string& path,
 | 
			
		||||
                                              const std::string& uri,
 | 
			
		||||
                                              const SharedHandle<Option>& opt)
 | 
			
		||||
{
 | 
			
		||||
  SharedHandle<DownloadContext> dctx(new DownloadContext(pieceLength,
 | 
			
		||||
                                                         totalLength,
 | 
			
		||||
                                                         path));
 | 
			
		||||
  std::vector<std::string> uris;
 | 
			
		||||
  uris.push_back(uri);
 | 
			
		||||
  dctx->getFirstFileEntry()->addUris(uris.begin(), uris.end());
 | 
			
		||||
  SharedHandle<RequestGroup> group(new RequestGroup(GroupId::create(), opt));
 | 
			
		||||
  group->setDownloadContext(dctx);
 | 
			
		||||
  return group;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace aria2
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,6 +12,7 @@ namespace aria2 {
 | 
			
		|||
class MessageDigest;
 | 
			
		||||
class RequestGroupMan;
 | 
			
		||||
class RequestGroup;
 | 
			
		||||
class Option;
 | 
			
		||||
 | 
			
		||||
void createFile(const std::string& filename, size_t length);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -64,4 +65,9 @@ SharedHandle<RequestGroup> findReservedGroup
 | 
			
		|||
SharedHandle<RequestGroup> getReservedGroup
 | 
			
		||||
(const SharedHandle<RequestGroupMan>& rgman, size_t index);
 | 
			
		||||
 | 
			
		||||
SharedHandle<RequestGroup> createRequestGroup(int32_t pieceLength,
 | 
			
		||||
                                              int64_t totalLength,
 | 
			
		||||
                                              const std::string& path,
 | 
			
		||||
                                              const std::string& uri,
 | 
			
		||||
                                              const SharedHandle<Option>& opt);
 | 
			
		||||
} // namespace aria2
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue