diff --git a/src/CreateRequestCommand.cc b/src/CreateRequestCommand.cc index 90cbc556..8db0cf56 100644 --- a/src/CreateRequestCommand.cc +++ b/src/CreateRequestCommand.cc @@ -79,7 +79,7 @@ bool CreateRequestCommand::executeInternal() getDownloadEngine()->getRequestGroupMan()->getUsedHosts(usedHosts); } setRequest - (getFileEntry()->getRequest(getRequestGroup()->getURISelector(), + (getFileEntry()->getRequest(getRequestGroup()->getURISelector().get(), getOption()->getAsBool(PREF_REUSE_URI), usedHosts, getOption()->get(PREF_REFERER), diff --git a/src/FileEntry.cc b/src/FileEntry.cc index 364b0cf4..79679052 100644 --- a/src/FileEntry.cc +++ b/src/FileEntry.cc @@ -141,7 +141,7 @@ OutputIterator enumerateInFlightHosts std::shared_ptr FileEntry::getRequest -(const std::shared_ptr& selector, +(URISelector* selector, bool uriReuse, const std::vector >& usedHosts, const std::string& referer, diff --git a/src/FileEntry.h b/src/FileEntry.h index 765d3104..648c6958 100644 --- a/src/FileEntry.h +++ b/src/FileEntry.h @@ -179,7 +179,7 @@ public: // are not be usable because maxConnectionPerServer_ limit, then // reuse used URIs and do selection again. std::shared_ptr getRequest - (const std::shared_ptr& selector, + (URISelector* selector, bool uriReuse, const std::vector >& usedHosts, const std::string& referer = A2STR::NIL, diff --git a/src/RequestGroup.cc b/src/RequestGroup.cc index c79b690e..6efe900b 100644 --- a/src/RequestGroup.cc +++ b/src/RequestGroup.cc @@ -136,7 +136,7 @@ RequestGroup::RequestGroup(const std::shared_ptr& gid, forceHaltRequested_(false), haltReason_(RequestGroup::NONE), pauseRequested_(false), - uriSelector_(new InorderURISelector()), + uriSelector_(make_unique()), lastModifiedTime_(Time::null()), fileNotFoundCount_(0), timeout_(option->getAsInt(PREF_TIMEOUT)), @@ -1212,9 +1212,9 @@ void RequestGroup::reportDownloadFinished() #endif // ENABLE_BITTORRENT } -void RequestGroup::setURISelector(const std::shared_ptr& uriSelector) +void RequestGroup::setURISelector(std::unique_ptr uriSelector) { - uriSelector_ = uriSelector; + uriSelector_ = std::move(uriSelector); } void RequestGroup::applyLastModifiedTimeToLocalFiles() diff --git a/src/RequestGroup.h b/src/RequestGroup.h index 6ba18145..42aacce6 100644 --- a/src/RequestGroup.h +++ b/src/RequestGroup.h @@ -135,7 +135,7 @@ private: std::vector > postDownloadHandlers_; - std::shared_ptr uriSelector_; + std::unique_ptr uriSelector_; Time lastModifiedTime_; @@ -414,9 +414,9 @@ public: void reportDownloadFinished(); - void setURISelector(const std::shared_ptr& uriSelector); + void setURISelector(std::unique_ptr uriSelector); - const std::shared_ptr& getURISelector() const + const std::unique_ptr& getURISelector() const { return uriSelector_; } diff --git a/src/RequestGroupMan.cc b/src/RequestGroupMan.cc index 11135f26..933f3807 100644 --- a/src/RequestGroupMan.cc +++ b/src/RequestGroupMan.cc @@ -424,16 +424,14 @@ void RequestGroupMan::configureRequestGroup { const std::string& uriSelectorValue = requestGroup->getOption()->get(PREF_URI_SELECTOR); - std::shared_ptr sel; if(uriSelectorValue == V_FEEDBACK) { - sel.reset(new FeedbackURISelector(serverStatMan_)); + requestGroup->setURISelector(make_unique + (serverStatMan_)); } else if(uriSelectorValue == V_INORDER) { - sel.reset(new InorderURISelector()); + requestGroup->setURISelector(make_unique()); } else if(uriSelectorValue == V_ADAPTIVE) { - sel.reset(new AdaptiveURISelector(serverStatMan_, requestGroup.get())); - } - if(sel) { - requestGroup->setURISelector(sel); + requestGroup->setURISelector(make_unique + (serverStatMan_, requestGroup.get())); } } diff --git a/test/FileEntryTest.cc b/test/FileEntryTest.cc index 2b599013..15e4d79b 100644 --- a/test/FileEntryTest.cc +++ b/test/FileEntryTest.cc @@ -46,18 +46,18 @@ CPPUNIT_TEST_SUITE_REGISTRATION( FileEntryTest ); namespace { std::shared_ptr createFileEntry() { - const char* uris[] = { "http://localhost/aria2.zip", - "ftp://localhost/aria2.zip", - "http://mirror/aria2.zip" }; - std::shared_ptr fileEntry(new FileEntry()); - fileEntry->setUris(std::vector(&uris[0], &uris[3])); + auto fileEntry = std::make_shared(); + fileEntry->setUris(std::vector{ + "http://localhost/aria2.zip", + "ftp://localhost/aria2.zip", + "http://mirror/aria2.zip" }); return fileEntry; } } // namespace void FileEntryTest::testRemoveURIWhoseHostnameIs() { - std::shared_ptr fileEntry = createFileEntry(); + auto fileEntry = createFileEntry(); fileEntry->removeURIWhoseHostnameIs("localhost"); CPPUNIT_ASSERT_EQUAL((size_t)1, fileEntry->getRemainingUris().size()); CPPUNIT_ASSERT_EQUAL(std::string("http://mirror/aria2.zip"), @@ -94,89 +94,76 @@ void FileEntryTest::testExtractURIResult() void FileEntryTest::testGetRequest() { - std::shared_ptr fileEntry = createFileEntry(); - std::shared_ptr selector(new InorderURISelector()); - std::vector > usedHosts; - std::shared_ptr req = - fileEntry->getRequest(selector, true, usedHosts); + auto fileEntry = createFileEntry(); + InorderURISelector selector{}; + std::vector> usedHosts; + auto req = fileEntry->getRequest(&selector, true, usedHosts); CPPUNIT_ASSERT_EQUAL(std::string("localhost"), req->getHost()); CPPUNIT_ASSERT_EQUAL(std::string("http"), req->getProtocol()); fileEntry->poolRequest(req); - std::shared_ptr req2nd = - fileEntry->getRequest(selector, true, usedHosts); + auto req2nd = fileEntry->getRequest(&selector, true, usedHosts); CPPUNIT_ASSERT_EQUAL(std::string("localhost"), req2nd->getHost()); CPPUNIT_ASSERT_EQUAL(std::string("http"), req2nd->getProtocol()); - std::shared_ptr req3rd = - fileEntry->getRequest(selector, true, usedHosts); + auto req3rd = fileEntry->getRequest(&selector, true, usedHosts); CPPUNIT_ASSERT_EQUAL(std::string("mirror"), req3rd->getHost()); CPPUNIT_ASSERT_EQUAL(std::string("http"), req3rd->getProtocol()); - std::shared_ptr req4th = - fileEntry->getRequest(selector, true, usedHosts); + auto req4th = fileEntry->getRequest(&selector, true, usedHosts); CPPUNIT_ASSERT(!req4th); fileEntry->setMaxConnectionPerServer(2); - std::shared_ptr req5th = - fileEntry->getRequest(selector, true, usedHosts); + auto req5th = fileEntry->getRequest(&selector, true, usedHosts); CPPUNIT_ASSERT_EQUAL(std::string("localhost"), req5th->getHost()); CPPUNIT_ASSERT_EQUAL(std::string("ftp"), req5th->getProtocol()); - std::shared_ptr req6th = - fileEntry->getRequest(selector, true, usedHosts); + auto req6th = fileEntry->getRequest(&selector, true, usedHosts); CPPUNIT_ASSERT_EQUAL(std::string("mirror"), req6th->getHost()); CPPUNIT_ASSERT_EQUAL(std::string("http"), req6th->getProtocol()); - std::shared_ptr req7th = - fileEntry->getRequest(selector, true, usedHosts); + auto req7th = fileEntry->getRequest(&selector, true, usedHosts); CPPUNIT_ASSERT(!req7th); } void FileEntryTest::testGetRequest_withoutUriReuse() { - std::vector > usedHosts; - std::shared_ptr fileEntry = createFileEntry(); + std::vector> usedHosts; + auto fileEntry = createFileEntry(); fileEntry->setMaxConnectionPerServer(2); - std::shared_ptr selector(new InorderURISelector()); - std::shared_ptr req = fileEntry->getRequest(selector, false, usedHosts); + InorderURISelector selector{}; + auto req = fileEntry->getRequest(&selector, false, usedHosts); CPPUNIT_ASSERT_EQUAL(std::string("localhost"), req->getHost()); CPPUNIT_ASSERT_EQUAL(std::string("http"), req->getProtocol()); - std::shared_ptr req2nd = - fileEntry->getRequest(selector, false, usedHosts); + auto req2nd = fileEntry->getRequest(&selector, false, usedHosts); CPPUNIT_ASSERT_EQUAL(std::string("localhost"), req2nd->getHost()); CPPUNIT_ASSERT_EQUAL(std::string("ftp"), req2nd->getProtocol()); - std::shared_ptr req3rd = - fileEntry->getRequest(selector, false, usedHosts); + auto req3rd = fileEntry->getRequest(&selector, false, usedHosts); CPPUNIT_ASSERT_EQUAL(std::string("mirror"), req3rd->getHost()); CPPUNIT_ASSERT_EQUAL(std::string("http"), req3rd->getProtocol()); - std::shared_ptr req4th = - fileEntry->getRequest(selector, false, usedHosts); + auto req4th = fileEntry->getRequest(&selector, false, usedHosts); CPPUNIT_ASSERT(!req4th); } void FileEntryTest::testGetRequest_withUniqueProtocol() { - std::vector > usedHosts; - std::shared_ptr fileEntry = createFileEntry(); + std::vector> usedHosts; + auto fileEntry = createFileEntry(); fileEntry->setUniqueProtocol(true); - std::shared_ptr selector(new InorderURISelector()); - std::shared_ptr req = - fileEntry->getRequest(selector, true, usedHosts); + InorderURISelector selector{}; + auto req = fileEntry->getRequest(&selector, true, usedHosts); CPPUNIT_ASSERT_EQUAL(std::string("localhost"), req->getHost()); CPPUNIT_ASSERT_EQUAL(std::string("http"), req->getProtocol()); - std::shared_ptr req2nd = - fileEntry->getRequest(selector, true, usedHosts); + auto req2nd = fileEntry->getRequest(&selector, true, usedHosts); CPPUNIT_ASSERT_EQUAL(std::string("mirror"), req2nd->getHost()); CPPUNIT_ASSERT_EQUAL(std::string("http"), req2nd->getProtocol()); - std::shared_ptr req3rd = - fileEntry->getRequest(selector, true, usedHosts); + auto req3rd = fileEntry->getRequest(&selector, true, usedHosts); CPPUNIT_ASSERT(!req3rd); CPPUNIT_ASSERT_EQUAL((size_t)2, fileEntry->getRemainingUris().size()); @@ -188,26 +175,26 @@ void FileEntryTest::testGetRequest_withUniqueProtocol() void FileEntryTest::testGetRequest_withReferer() { - std::shared_ptr fileEntry = createFileEntry(); - std::shared_ptr selector(new InorderURISelector()); - std::vector > usedHosts; - std::shared_ptr req = - fileEntry->getRequest(selector, true, usedHosts, "http://referer"); + auto fileEntry = createFileEntry(); + InorderURISelector selector{}; + std::vector> usedHosts; + auto req = fileEntry->getRequest(&selector, true, usedHosts, + "http://referer"); CPPUNIT_ASSERT_EQUAL(std::string("http://referer"), req->getReferer()); // URI is used as referer if "*" is given. - req = fileEntry->getRequest(selector, true, usedHosts, "*"); + req = fileEntry->getRequest(&selector, true, usedHosts, "*"); CPPUNIT_ASSERT_EQUAL(req->getUri(), req->getReferer()); } void FileEntryTest::testReuseUri() { - std::shared_ptr selector(new InorderURISelector()); - std::shared_ptr fileEntry = createFileEntry(); + InorderURISelector selector{}; + auto fileEntry = createFileEntry(); fileEntry->setMaxConnectionPerServer(3); size_t numUris = fileEntry->getRemainingUris().size(); - std::vector > usedHosts; + std::vector> usedHosts; for(size_t i = 0; i < numUris; ++i) { - fileEntry->getRequest(selector, false, usedHosts); + fileEntry->getRequest(&selector, false, usedHosts); } CPPUNIT_ASSERT_EQUAL((size_t)0, fileEntry->getRemainingUris().size()); fileEntry->addURIResult("http://localhost/aria2.zip", @@ -215,11 +202,11 @@ void FileEntryTest::testReuseUri() std::vector ignore; fileEntry->reuseUri(ignore); CPPUNIT_ASSERT_EQUAL((size_t)2, fileEntry->getRemainingUris().size()); - std::deque uris = fileEntry->getRemainingUris(); + auto uris = fileEntry->getRemainingUris(); CPPUNIT_ASSERT_EQUAL(std::string("ftp://localhost/aria2.zip"), uris[0]); CPPUNIT_ASSERT_EQUAL(std::string("http://mirror/aria2.zip"), uris[1]); for(size_t i = 0; i < 2; ++i) { - fileEntry->getRequest(selector, false, usedHosts); + fileEntry->getRequest(&selector, false, usedHosts); } CPPUNIT_ASSERT_EQUAL((size_t)0, fileEntry->getRemainingUris().size()); ignore.clear(); @@ -260,7 +247,7 @@ void FileEntryTest::testInsertUri() CPPUNIT_ASSERT(file.insertUri("http://example.org/2", 0)); CPPUNIT_ASSERT(file.insertUri("http://example.org/3", 1)); CPPUNIT_ASSERT(file.insertUri("http://example.org/4", 5)); - std::deque uris = file.getRemainingUris(); + auto& uris = file.getRemainingUris(); CPPUNIT_ASSERT_EQUAL(std::string("http://example.org/2"), uris[0]); CPPUNIT_ASSERT_EQUAL(std::string("http://example.org/3"), uris[1]); CPPUNIT_ASSERT_EQUAL(std::string("http://example.org/1"), uris[2]); @@ -278,8 +265,8 @@ void FileEntryTest::testInsertUri() void FileEntryTest::testRemoveUri() { - std::vector > usedHosts; - std::shared_ptr selector(new InorderURISelector()); + std::vector> usedHosts; + InorderURISelector selector{}; FileEntry file; file.addUri("http://example.org/"); CPPUNIT_ASSERT(file.removeUri("http://example.org/")); @@ -287,8 +274,7 @@ void FileEntryTest::testRemoveUri() CPPUNIT_ASSERT(!file.removeUri("http://example.org/")); file.addUri("http://example.org/"); - std::shared_ptr exampleOrgReq = - file.getRequest(selector, true, usedHosts); + auto exampleOrgReq = file.getRequest(&selector, true, usedHosts); CPPUNIT_ASSERT(!exampleOrgReq->removalRequested()); CPPUNIT_ASSERT_EQUAL((size_t)1, file.getSpentUris().size()); CPPUNIT_ASSERT(file.removeUri("http://example.org/")); @@ -298,7 +284,7 @@ void FileEntryTest::testRemoveUri() CPPUNIT_ASSERT_EQUAL((size_t)0, file.countPooledRequest()); file.addUri("http://example.org/"); - exampleOrgReq = file.getRequest(selector, true, usedHosts); + exampleOrgReq = file.getRequest(&selector, true, usedHosts); file.poolRequest(exampleOrgReq); CPPUNIT_ASSERT_EQUAL((size_t)1, file.countPooledRequest()); CPPUNIT_ASSERT(file.removeUri("http://example.org/")); @@ -311,17 +297,15 @@ void FileEntryTest::testRemoveUri() void FileEntryTest::testPutBackRequest() { - std::shared_ptr fileEntry = createFileEntry(); - std::shared_ptr selector(new InorderURISelector()); - std::vector > usedHosts; - std::shared_ptr req1 = - fileEntry->getRequest(selector, false, usedHosts); - std::shared_ptr req2 = - fileEntry->getRequest(selector, false, usedHosts); + auto fileEntry = createFileEntry(); + InorderURISelector selector{}; + std::vector> usedHosts; + auto req1 = fileEntry->getRequest(&selector, false, usedHosts); + auto req2 = fileEntry->getRequest(&selector, false, usedHosts); CPPUNIT_ASSERT_EQUAL((size_t)1, fileEntry->getRemainingUris().size()); fileEntry->poolRequest(req2); fileEntry->putBackRequest(); - const std::deque& uris = fileEntry->getRemainingUris(); + auto& uris = fileEntry->getRemainingUris(); CPPUNIT_ASSERT_EQUAL((size_t)3, uris.size()); CPPUNIT_ASSERT_EQUAL(std::string("http://localhost/aria2.zip"), uris[0]); CPPUNIT_ASSERT_EQUAL(std::string("http://mirror/aria2.zip"), uris[1]);