diff --git a/src/BtRegistry.cc b/src/BtRegistry.cc index 360b86f6..07ad3a3a 100644 --- a/src/BtRegistry.cc +++ b/src/BtRegistry.cc @@ -42,6 +42,7 @@ #include "BtProgressInfoFile.h" #include "bittorrent_helper.h" #include "LpdMessageReceiver.h" +#include "NullHandle.h" namespace aria2 { @@ -51,37 +52,41 @@ BtRegistry::BtRegistry() BtRegistry::~BtRegistry() {} -SharedHandle +const SharedHandle& BtRegistry::getDownloadContext(a2_gid_t gid) const { - return get(gid).downloadContext_; + const SharedHandle& res = get(gid); + if(res) { + return res->downloadContext; + } else { + return getNull(); + } } -SharedHandle +const SharedHandle& BtRegistry::getDownloadContext(const std::string& infoHash) const { - SharedHandle dctx; - for(std::map::const_iterator i = pool_.begin(), - eoi = pool_.end(); i != eoi; ++i) { - if(bittorrent::getTorrentAttrs((*i).second.downloadContext_)->infoHash == + for(std::map >::const_iterator i = + pool_.begin(), eoi = pool_.end(); i != eoi; ++i) { + if(bittorrent::getTorrentAttrs((*i).second->downloadContext)->infoHash == infoHash) { - dctx = (*i).second.downloadContext_; - break; + return (*i).second->downloadContext; } } - return dctx; + return getNull(); } -void BtRegistry::put(a2_gid_t gid, const BtObject& obj) +void BtRegistry::put(a2_gid_t gid, const SharedHandle& obj) { pool_[gid] = obj; } -BtObject BtRegistry::get(a2_gid_t gid) const +const SharedHandle& BtRegistry::get(a2_gid_t gid) const { - std::map::const_iterator i = pool_.find(gid); + std::map >::const_iterator i = + pool_.find(gid); if(i == pool_.end()) { - return BtObject(); + return getNull(); } else { return (*i).second; } @@ -109,23 +114,23 @@ BtObject::BtObject const SharedHandle& btAnnounce, const SharedHandle& btRuntime, const SharedHandle& btProgressInfoFile) - : downloadContext_(downloadContext), - pieceStorage_(pieceStorage), - peerStorage_(peerStorage), - btAnnounce_(btAnnounce), - btRuntime_(btRuntime), - btProgressInfoFile_(btProgressInfoFile) + : downloadContext(downloadContext), + pieceStorage(pieceStorage), + peerStorage(peerStorage), + btAnnounce(btAnnounce), + btRuntime(btRuntime), + btProgressInfoFile(btProgressInfoFile) {} BtObject::BtObject() {} BtObject::BtObject(const BtObject& c) - : downloadContext_(c.downloadContext_), - pieceStorage_(c.pieceStorage_), - peerStorage_(c.peerStorage_), - btAnnounce_(c.btAnnounce_), - btRuntime_(c.btRuntime_), - btProgressInfoFile_(c.btProgressInfoFile_) + : downloadContext(c.downloadContext), + pieceStorage(c.pieceStorage), + peerStorage(c.peerStorage), + btAnnounce(c.btAnnounce), + btRuntime(c.btRuntime), + btProgressInfoFile(c.btProgressInfoFile) {} BtObject::~BtObject() {} @@ -133,24 +138,14 @@ BtObject::~BtObject() {} BtObject& BtObject::operator=(const BtObject& c) { if(this != &c) { - downloadContext_ = c.downloadContext_; - pieceStorage_ = c.pieceStorage_; - peerStorage_ = c.peerStorage_; - btAnnounce_ = c.btAnnounce_; - btRuntime_ = c.btRuntime_; - btProgressInfoFile_ = c.btProgressInfoFile_; + downloadContext = c.downloadContext; + pieceStorage = c.pieceStorage; + peerStorage = c.peerStorage; + btAnnounce = c.btAnnounce; + btRuntime = c.btRuntime; + btProgressInfoFile = c.btProgressInfoFile; } return *this; } -bool BtObject::isNull() const -{ - return !downloadContext_ && - !pieceStorage_ && - !peerStorage_ && - !btAnnounce_ && - !btRuntime_ && - !btProgressInfoFile_; -} - } // namespace aria2 diff --git a/src/BtRegistry.h b/src/BtRegistry.h index 1ea9f44f..a4791210 100644 --- a/src/BtRegistry.h +++ b/src/BtRegistry.h @@ -53,12 +53,12 @@ class DownloadContext; class LpdMessageReceiver; struct BtObject { - SharedHandle downloadContext_; - SharedHandle pieceStorage_; - SharedHandle peerStorage_; - SharedHandle btAnnounce_; - SharedHandle btRuntime_; - SharedHandle btProgressInfoFile_; + SharedHandle downloadContext; + SharedHandle pieceStorage; + SharedHandle peerStorage; + SharedHandle btAnnounce; + SharedHandle btRuntime; + SharedHandle btProgressInfoFile; BtObject(const SharedHandle& downloadContext, const SharedHandle& pieceStorage, @@ -74,35 +74,33 @@ struct BtObject { ~BtObject(); BtObject& operator=(const BtObject& c); - - bool isNull() const; }; class BtRegistry { private: - std::map pool_; + std::map > pool_; uint16_t tcpPort_; SharedHandle lpdMessageReceiver_; public: BtRegistry(); ~BtRegistry(); - SharedHandle + const SharedHandle& getDownloadContext(a2_gid_t gid) const; - SharedHandle + const SharedHandle& getDownloadContext(const std::string& infoHash) const; - void put(a2_gid_t gid, const BtObject& obj); + void put(a2_gid_t gid, const SharedHandle& obj); - BtObject get(a2_gid_t gid) const; + const SharedHandle& get(a2_gid_t gid) const; template OutputIterator getAllDownloadContext(OutputIterator dest) { - for(std::map::const_iterator i = pool_.begin(), - eoi = pool_.end(); i != eoi; ++i) { - *dest++ = (*i).second.downloadContext_; + for(std::map >::const_iterator i = + pool_.begin(), eoi = pool_.end(); i != eoi; ++i) { + *dest++ = (*i).second->downloadContext; } return dest; } diff --git a/src/BtSetup.cc b/src/BtSetup.cc index 7ae588b4..94879c97 100644 --- a/src/BtSetup.cc +++ b/src/BtSetup.cc @@ -101,11 +101,11 @@ void BtSetup::setup(std::vector& commands, bittorrent::getTorrentAttrs(requestGroup->getDownloadContext()); bool metadataGetMode = torrentAttrs->metadata.empty(); const SharedHandle& btReg = e->getBtRegistry(); - BtObject btObject = btReg->get(requestGroup->getGID()); - SharedHandle pieceStorage = btObject.pieceStorage_; - SharedHandle peerStorage = btObject.peerStorage_; - SharedHandle btRuntime = btObject.btRuntime_; - SharedHandle btAnnounce = btObject.btAnnounce_; + const SharedHandle& btObject = btReg->get(requestGroup->getGID()); + const SharedHandle& pieceStorage = btObject->pieceStorage; + const SharedHandle& peerStorage = btObject->peerStorage; + const SharedHandle& btRuntime = btObject->btRuntime; + const SharedHandle& btAnnounce = btObject->btAnnounce; // commands { TrackerWatcherCommand* c = diff --git a/src/ConsoleStatCalc.cc b/src/ConsoleStatCalc.cc index 5fda0dcc..ecc50b18 100644 --- a/src/ConsoleStatCalc.cc +++ b/src/ConsoleStatCalc.cc @@ -140,11 +140,10 @@ void printProgress << "CN:" << rg->getNumConnection(); #ifdef ENABLE_BITTORRENT - SharedHandle ps = - e->getBtRegistry()->get(rg->getGID()).peerStorage_; - if(ps) { + const SharedHandle& btObj = e->getBtRegistry()->get(rg->getGID()); + if(btObj) { std::vector > peers; - ps->getActivePeers(peers); + btObj->peerStorage->getActivePeers(peers); o << " " << "SEED:" << countSeeder(peers.begin(), peers.end()); } diff --git a/src/LpdReceiveMessageCommand.cc b/src/LpdReceiveMessageCommand.cc index 55ba0a7f..0a7c507b 100644 --- a/src/LpdReceiveMessageCommand.cc +++ b/src/LpdReceiveMessageCommand.cc @@ -94,9 +94,9 @@ bool LpdReceiveMessageCommand::execute() } RequestGroup* group = dctx->getOwnerRequestGroup(); assert(group); - BtObject btobj = reg->get(group->getGID()); - assert(!btobj.isNull()); - SharedHandle peerStorage = btobj.peerStorage_; + const SharedHandle& btobj = reg->get(group->getGID()); + assert(btobj); + const SharedHandle& peerStorage = btobj->peerStorage; assert(peerStorage); SharedHandle peer = m->peer; if(peerStorage->addPeer(peer)) { diff --git a/src/Makefile.am b/src/Makefile.am index eb10b1e4..4a4477d7 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -229,7 +229,8 @@ SRCS = Socket.h\ NullOutputFile.h\ console.cc console.h\ BufferedFile.cc BufferedFile.h\ - SegList.h + SegList.h\ + NullHandle.h if MINGW_BUILD SRCS += WinConsoleFile.cc WinConsoleFile.h diff --git a/src/NullHandle.h b/src/NullHandle.h new file mode 100644 index 00000000..0e739bda --- /dev/null +++ b/src/NullHandle.h @@ -0,0 +1,53 @@ +/* */ +#ifndef D_NULL_HANDLE_H +#define D_NULL_HANDLE_H + +#include "SharedHandle.h" + +namespace aria2 { + +// Returns const reference of SharedHandle(). Static variable null +// is shared by all instantiation of this function template. +template +const SharedHandle& getNull() +{ + static SharedHandle null; + return null; +} + +} // namespace aria2 + +#endif // D_NULL_HANDLE_H diff --git a/src/PeerReceiveHandshakeCommand.cc b/src/PeerReceiveHandshakeCommand.cc index e34a749e..438dd7bb 100644 --- a/src/PeerReceiveHandshakeCommand.cc +++ b/src/PeerReceiveHandshakeCommand.cc @@ -109,11 +109,12 @@ bool PeerReceiveHandshakeCommand::executeInternal() (fmt("Unknown info hash %s", util::toHex(infoHash).c_str())); } - BtObject btObject = getDownloadEngine()->getBtRegistry()->get + const SharedHandle& btObject = + getDownloadEngine()->getBtRegistry()->get (downloadContext->getOwnerRequestGroup()->getGID()); - SharedHandle btRuntime = btObject.btRuntime_; - SharedHandle pieceStorage = btObject.pieceStorage_; - SharedHandle peerStorage = btObject.peerStorage_; + const SharedHandle& btRuntime = btObject->btRuntime; + const SharedHandle& pieceStorage = btObject->pieceStorage; + const SharedHandle& peerStorage = btObject->peerStorage; if(!btRuntime->ready()) { throw DL_ABORT_EX (fmt("Unknown info hash %s", diff --git a/src/RequestGroup.cc b/src/RequestGroup.cc index 4d001ab0..5b3d40a8 100644 --- a/src/RequestGroup.cc +++ b/src/RequestGroup.cc @@ -354,17 +354,18 @@ void RequestGroup::createInitialCommand (option_->getAsInt(PREF_BT_TRACKER_INTERVAL)); btAnnounce->shuffleAnnounce(); - assert(btRegistry->get(gid_).isNull()); + assert(!btRegistry->get(gid_)); btRegistry->put - (gid_, BtObject - (downloadContext_, - pieceStorage_, - peerStorage, - btAnnounce, - btRuntime, - (progressInfoFile ? - SharedHandle(progressInfoFile) : - progressInfoFile_))); + (gid_, SharedHandle + (new BtObject + (downloadContext_, + pieceStorage_, + peerStorage, + btAnnounce, + btRuntime, + (progressInfoFile ? + SharedHandle(progressInfoFile) : + progressInfoFile_)))); if(metadataGetMode) { if(option_->getAsBool(PREF_ENABLE_DHT) || (!e->getOption()->getAsBool(PREF_DISABLE_IPV6) && diff --git a/src/RpcMethodImpl.cc b/src/RpcMethodImpl.cc index b5ba8aea..c2036426 100644 --- a/src/RpcMethodImpl.cc +++ b/src/RpcMethodImpl.cc @@ -753,7 +753,7 @@ namespace { void gatherProgressBitTorrent (const SharedHandle& entryDict, const SharedHandle& torrentAttrs, - const BtObject& btObject, + const SharedHandle& btObject, const std::vector& keys) { if(requested_key(keys, KEY_INFO_HASH)) { @@ -765,10 +765,10 @@ void gatherProgressBitTorrent entryDict->put(KEY_BITTORRENT, btDict); } if(requested_key(keys, KEY_NUM_SEEDERS)) { - if(btObject.isNull()) { + if(!btObject) { entryDict->put(KEY_NUM_SEEDERS, VLB_ZERO); } else { - SharedHandle peerStorage = btObject.peerStorage_; + const SharedHandle& peerStorage = btObject->peerStorage; assert(peerStorage); std::vector > peers; peerStorage->getActivePeers(peers); @@ -822,7 +822,8 @@ void gatherProgress if(group->getDownloadContext()->hasAttribute(bittorrent::BITTORRENT)) { SharedHandle torrentAttrs = bittorrent::getTorrentAttrs(group->getDownloadContext()); - BtObject btObject = e->getBtRegistry()->get(group->getGID()); + const SharedHandle& btObject = + e->getBtRegistry()->get(group->getGID()); gatherProgressBitTorrent(entryDict, torrentAttrs, btObject, keys); } #endif // ENABLE_BITTORRENT @@ -981,10 +982,11 @@ SharedHandle GetPeersRpcMethod::process util::itos(gid).c_str())); } SharedHandle peers = List::g(); - BtObject btObject = e->getBtRegistry()->get(group->getGID()); - if(!btObject.isNull()) { - assert(btObject.peerStorage_); - gatherPeer(peers, btObject.peerStorage_); + const SharedHandle& btObject = + e->getBtRegistry()->get(group->getGID()); + if(btObject) { + assert(btObject->peerStorage); + gatherPeer(peers, btObject->peerStorage); } return peers; } @@ -1153,10 +1155,11 @@ void changeOption group->setMaxUploadSpeedLimit(option.getAsInt(PREF_MAX_UPLOAD_LIMIT)); } #ifdef ENABLE_BITTORRENT - BtObject btObject = e->getBtRegistry()->get(group->getGID()); - if(!btObject.isNull()) { + const SharedHandle& btObject = + e->getBtRegistry()->get(group->getGID()); + if(btObject) { if(option.defined(PREF_BT_MAX_PEERS)) { - btObject.btRuntime_->setMaxPeers(option.getAsInt(PREF_BT_MAX_PEERS)); + btObject->btRuntime->setMaxPeers(option.getAsInt(PREF_BT_MAX_PEERS)); } } #endif // ENABLE_BITTORRENT diff --git a/test/BtRegistryTest.cc b/test/BtRegistryTest.cc index 1ce132bd..3af3bd13 100644 --- a/test/BtRegistryTest.cc +++ b/test/BtRegistryTest.cc @@ -41,8 +41,8 @@ void BtRegistryTest::testGetDownloadContext() BtRegistry btRegistry; CPPUNIT_ASSERT(!btRegistry.getDownloadContext(1)); SharedHandle dctx(new DownloadContext()); - BtObject btObject; - btObject.downloadContext_ = dctx; + SharedHandle btObject(new BtObject()); + btObject->downloadContext = dctx; btRegistry.put(1, btObject); CPPUNIT_ASSERT_EQUAL(dctx.get(), btRegistry.getDownloadContext(1).get()); } @@ -52,10 +52,10 @@ void addTwoDownloadContext(BtRegistry& btRegistry) { SharedHandle dctx1(new DownloadContext()); SharedHandle dctx2(new DownloadContext()); - BtObject btObject1; - btObject1.downloadContext_ = dctx1; - BtObject btObject2; - btObject2.downloadContext_ = dctx2; + SharedHandle btObject1(new BtObject()); + btObject1->downloadContext = dctx1; + SharedHandle btObject2(new BtObject()); + btObject2->downloadContext = dctx2; btRegistry.put(1, btObject1); btRegistry.put(2, btObject2); } @@ -95,8 +95,8 @@ void BtRegistryTest::testRemove() BtRegistry btRegistry; addTwoDownloadContext(btRegistry); CPPUNIT_ASSERT(btRegistry.remove(1)); - CPPUNIT_ASSERT(btRegistry.get(1).isNull()); - CPPUNIT_ASSERT(!btRegistry.get(2).isNull()); + CPPUNIT_ASSERT(!btRegistry.get(1)); + CPPUNIT_ASSERT(btRegistry.get(2)); } void BtRegistryTest::testRemoveAll() @@ -104,8 +104,8 @@ void BtRegistryTest::testRemoveAll() BtRegistry btRegistry; addTwoDownloadContext(btRegistry); btRegistry.removeAll(); - CPPUNIT_ASSERT(btRegistry.get(1).isNull()); - CPPUNIT_ASSERT(btRegistry.get(2).isNull()); + CPPUNIT_ASSERT(!btRegistry.get(1)); + CPPUNIT_ASSERT(!btRegistry.get(2)); } } // namespace aria2 diff --git a/test/RpcMethodTest.cc b/test/RpcMethodTest.cc index 8987755f..d524242f 100644 --- a/test/RpcMethodTest.cc +++ b/test/RpcMethodTest.cc @@ -452,8 +452,8 @@ void RpcMethodTest::testChangeOption() opt->put(PREF_BT_REQUEST_PEER_SPEED_LIMIT->k, "300K"); opt->put(PREF_MAX_UPLOAD_LIMIT->k, "50K"); - BtObject btObject; - btObject.btRuntime_ = SharedHandle(new BtRuntime()); + SharedHandle btObject(new BtObject()); + btObject->btRuntime = SharedHandle(new BtRuntime()); e_->getBtRegistry()->put(group->getGID(), btObject); #endif // ENABLE_BITTORRENT req.params->append(opt); @@ -471,7 +471,7 @@ void RpcMethodTest::testChangeOption() option->get(PREF_BT_REQUEST_PEER_SPEED_LIMIT)); CPPUNIT_ASSERT_EQUAL(std::string("100"), option->get(PREF_BT_MAX_PEERS)); - CPPUNIT_ASSERT_EQUAL((unsigned int)100, btObject.btRuntime_->getMaxPeers()); + CPPUNIT_ASSERT_EQUAL((unsigned int)100, btObject->btRuntime->getMaxPeers()); CPPUNIT_ASSERT_EQUAL((unsigned int)50*1024, group->getMaxUploadSpeedLimit());