From 3f5f1e26d9932a00caffb4866e8a277b7477fa47 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Sat, 6 Jul 2013 21:12:55 +0900 Subject: [PATCH] Refactor PeerInterationCommand ctor --- src/DefaultBtInteractive.cc | 38 +++-- src/DefaultBtInteractive.h | 43 ++---- src/InitiatorMSEHandshakeCommand.cc | 6 +- src/PeerInteractionCommand.cc | 231 ++++++++++++++-------------- src/PeerInteractionCommand.h | 6 +- src/PeerReceiveHandshakeCommand.cc | 11 +- src/PeerReceiveHandshakeCommand.h | 5 +- src/ReceiverMSEHandshakeCommand.cc | 21 +-- 8 files changed, 181 insertions(+), 180 deletions(-) diff --git a/src/DefaultBtInteractive.cc b/src/DefaultBtInteractive.cc index a8f792d8..18887970 100644 --- a/src/DefaultBtInteractive.cc +++ b/src/DefaultBtInteractive.cc @@ -614,27 +614,27 @@ void DefaultBtInteractive::setPeer(const std::shared_ptr& peer) } void DefaultBtInteractive::setBtMessageReceiver -(const std::shared_ptr& receiver) +(std::unique_ptr receiver) { - btMessageReceiver_ = receiver; + btMessageReceiver_ = std::move(receiver); } void DefaultBtInteractive::setDispatcher -(const std::shared_ptr& dispatcher) +(std::unique_ptr dispatcher) { - dispatcher_ = dispatcher; + dispatcher_ = std::move(dispatcher); } void DefaultBtInteractive::setBtRequestFactory -(const std::shared_ptr& factory) +(std::unique_ptr factory) { - btRequestFactory_ = factory; + btRequestFactory_ = std::move(factory); } void DefaultBtInteractive::setPeerConnection -(const std::shared_ptr& peerConnection) +(std::unique_ptr peerConnection) { - peerConnection_ = peerConnection; + peerConnection_ = std::move(peerConnection); } void DefaultBtInteractive::setExtensionMessageFactory @@ -644,9 +644,9 @@ void DefaultBtInteractive::setExtensionMessageFactory } void DefaultBtInteractive::setBtMessageFactory -(const std::shared_ptr& factory) +(std::unique_ptr factory) { - messageFactory_ = factory; + messageFactory_ = std::move(factory); } void DefaultBtInteractive::setRequestGroupMan(RequestGroupMan* rgman) @@ -654,4 +654,22 @@ void DefaultBtInteractive::setRequestGroupMan(RequestGroupMan* rgman) requestGroupMan_ = rgman; } +void DefaultBtInteractive::setExtensionMessageRegistry +(std::unique_ptr registry) +{ + extensionMessageRegistry_ = std::move(registry); +} + +void DefaultBtInteractive::setUTMetadataRequestTracker +(std::unique_ptr tracker) +{ + utMetadataRequestTracker_ = std::move(tracker); +} + +void DefaultBtInteractive::setUTMetadataRequestFactory +(std::unique_ptr factory) +{ + utMetadataRequestFactory_ = std::move(factory); +} + } // namespace aria2 diff --git a/src/DefaultBtInteractive.h b/src/DefaultBtInteractive.h index 10aeb3ab..3cabf13c 100644 --- a/src/DefaultBtInteractive.h +++ b/src/DefaultBtInteractive.h @@ -110,17 +110,15 @@ private: std::shared_ptr peer_; - std::shared_ptr btMessageReceiver_; - std::shared_ptr dispatcher_; - std::shared_ptr btRequestFactory_; - // Although peerStorage_ is not used in this class, this object - // holds the reference so that peerConnection_ is not deleted. - std::shared_ptr peerConnection_; - std::shared_ptr messageFactory_; + std::unique_ptr btMessageReceiver_; + std::unique_ptr dispatcher_; + std::unique_ptr btRequestFactory_; + std::unique_ptr peerConnection_; + std::unique_ptr messageFactory_; std::unique_ptr extensionMessageFactory_; - std::shared_ptr extensionMessageRegistry_; - std::shared_ptr utMetadataRequestFactory_; - std::shared_ptr utMetadataRequestTracker_; + std::unique_ptr extensionMessageRegistry_; + std::unique_ptr utMetadataRequestFactory_; + std::unique_ptr utMetadataRequestTracker_; bool metadataGetMode_; @@ -210,24 +208,21 @@ public: void setPeer(const std::shared_ptr& peer); - void setBtMessageReceiver(const std::shared_ptr& receiver); + void setBtMessageReceiver(std::unique_ptr receiver); - void setDispatcher(const std::shared_ptr& dispatcher); + void setDispatcher(std::unique_ptr dispatcher); - void setBtRequestFactory(const std::shared_ptr& factory); + void setBtRequestFactory(std::unique_ptr factory); - void setPeerConnection(const std::shared_ptr& peerConnection); + void setPeerConnection(std::unique_ptr peerConnection); - void setBtMessageFactory(const std::shared_ptr& factory); + void setBtMessageFactory(std::unique_ptr factory); void setExtensionMessageFactory (std::unique_ptr factory); void setExtensionMessageRegistry - (const std::shared_ptr& registry) - { - extensionMessageRegistry_ = registry; - } + (std::unique_ptr registry); void setKeepAliveInterval(time_t keepAliveInterval) { keepAliveInterval_ = keepAliveInterval; @@ -248,16 +243,10 @@ public: void setRequestGroupMan(RequestGroupMan* rgman); void setUTMetadataRequestTracker - (const std::shared_ptr& tracker) - { - utMetadataRequestTracker_ = tracker; - } + (std::unique_ptr tracker); void setUTMetadataRequestFactory - (const std::shared_ptr& factory) - { - utMetadataRequestFactory_ = factory; - } + (std::unique_ptr factory); void enableMetadataGetMode() { diff --git a/src/InitiatorMSEHandshakeCommand.cc b/src/InitiatorMSEHandshakeCommand.cc index e21ef684..7eec7788 100644 --- a/src/InitiatorMSEHandshakeCommand.cc +++ b/src/InitiatorMSEHandshakeCommand.cc @@ -149,8 +149,8 @@ bool InitiatorMSEHandshakeCommand::executeInternal() { } case INITIATOR_RECEIVE_PAD_D: { if(mseHandshake_->receivePad()) { - std::shared_ptr peerConnection - (new PeerConnection(getCuid(), getPeer(), getSocket())); + auto peerConnection = make_unique + (getCuid(), getPeer(), getSocket()); if(mseHandshake_->getNegotiatedCryptoType() == MSEHandshake::CRYPTO_ARC4){ size_t buflen = mseHandshake_->getBufferLength(); @@ -172,7 +172,7 @@ bool InitiatorMSEHandshakeCommand::executeInternal() { peerStorage_, getSocket(), PeerInteractionCommand::INITIATOR_SEND_HANDSHAKE, - peerConnection)); + std::move(peerConnection))); return true; } else { done = true; diff --git a/src/PeerInteractionCommand.cc b/src/PeerInteractionCommand.cc index 6ef89187..8cc9635e 100644 --- a/src/PeerInteractionCommand.cc +++ b/src/PeerInteractionCommand.cc @@ -90,13 +90,13 @@ PeerInteractionCommand::PeerInteractionCommand const std::shared_ptr& peerStorage, const std::shared_ptr& s, Seq sequence, - const std::shared_ptr& passedPeerConnection) - :PeerAbstractCommand(cuid, p, e, s), - requestGroup_(requestGroup), - btRuntime_(btRuntime), - pieceStorage_(pieceStorage), - peerStorage_(peerStorage), - sequence_(sequence) + std::unique_ptr peerConnection) + : PeerAbstractCommand{cuid, p, e, s}, + requestGroup_{requestGroup}, + btRuntime_{btRuntime}, + pieceStorage_{pieceStorage}, + peerStorage_{peerStorage}, + sequence_{sequence} { // TODO move following bunch of processing to separate method, like init() if(sequence_ == INITIATOR_SEND_HANDSHAKE) { @@ -119,59 +119,47 @@ PeerInteractionCommand::PeerInteractionCommand bittorrent::getTorrentAttrs(requestGroup_->getDownloadContext()); bool metadataGetMode = torrentAttrs->metadata.empty(); - std::shared_ptr exMsgRegistry - (new ExtensionMessageRegistry()); + auto exMsgRegistry = make_unique(); exMsgRegistry->setExtensionMessageID(ExtensionMessageRegistry::UT_PEX, 8); // http://www.bittorrent.org/beps/bep_0009.html exMsgRegistry->setExtensionMessageID(ExtensionMessageRegistry::UT_METADATA, 9); - std::shared_ptr utMetadataRequestFactory; - std::shared_ptr utMetadataRequestTracker; - if(metadataGetMode) { - utMetadataRequestFactory.reset(new UTMetadataRequestFactory()); - utMetadataRequestTracker.reset(new UTMetadataRequestTracker()); - } - auto extensionMessageFactory = make_unique(getPeer(), exMsgRegistry.get()); + auto extensionMessageFactoryPtr = extensionMessageFactory.get(); extensionMessageFactory->setPeerStorage(peerStorage.get()); extensionMessageFactory->setDownloadContext (requestGroup_->getDownloadContext().get()); - extensionMessageFactory->setUTMetadataRequestTracker - (utMetadataRequestTracker.get()); // PieceStorage will be set later. - DefaultBtMessageFactory* factoryPtr(new DefaultBtMessageFactory()); - factoryPtr->setCuid(cuid); - factoryPtr->setDownloadContext(requestGroup_->getDownloadContext().get()); - factoryPtr->setPieceStorage(pieceStorage.get()); - factoryPtr->setPeerStorage(peerStorage.get()); - factoryPtr->setExtensionMessageFactory(extensionMessageFactory.get()); - factoryPtr->setPeer(getPeer()); + auto factory = make_unique(); + auto factoryPtr = factory.get(); + factory->setCuid(cuid); + factory->setDownloadContext(requestGroup_->getDownloadContext().get()); + factory->setPieceStorage(pieceStorage.get()); + factory->setPeerStorage(peerStorage.get()); + factory->setExtensionMessageFactory(extensionMessageFactory.get()); + factory->setPeer(getPeer()); if(family == AF_INET) { - factoryPtr->setLocalNode(DHTRegistry::getData().localNode.get()); - factoryPtr->setRoutingTable(DHTRegistry::getData().routingTable.get()); - factoryPtr->setTaskQueue(DHTRegistry::getData().taskQueue.get()); - factoryPtr->setTaskFactory(DHTRegistry::getData().taskFactory.get()); + factory->setLocalNode(DHTRegistry::getData().localNode.get()); + factory->setRoutingTable(DHTRegistry::getData().routingTable.get()); + factory->setTaskQueue(DHTRegistry::getData().taskQueue.get()); + factory->setTaskFactory(DHTRegistry::getData().taskFactory.get()); } else { - factoryPtr->setLocalNode(DHTRegistry::getData6().localNode.get()); - factoryPtr->setRoutingTable(DHTRegistry::getData6().routingTable.get()); - factoryPtr->setTaskQueue(DHTRegistry::getData6().taskQueue.get()); - factoryPtr->setTaskFactory(DHTRegistry::getData6().taskFactory.get()); + factory->setLocalNode(DHTRegistry::getData6().localNode.get()); + factory->setRoutingTable(DHTRegistry::getData6().routingTable.get()); + factory->setTaskQueue(DHTRegistry::getData6().taskQueue.get()); + factory->setTaskFactory(DHTRegistry::getData6().taskFactory.get()); } if(metadataGetMode) { - factoryPtr->enableMetadataGetMode(); + factory->enableMetadataGetMode(); } - std::shared_ptr factory(factoryPtr); - - std::shared_ptr peerConnection; - if(!passedPeerConnection) { - peerConnection.reset(new PeerConnection(cuid, getPeer(), getSocket())); + if(!peerConnection) { + peerConnection = make_unique(cuid, getPeer(), getSocket()); } else { - peerConnection = passedPeerConnection; if(sequence_ == RECEIVER_WAIT_HANDSHAKE && peerConnection->getBufferLength() > 0) { setStatus(Command::STATUS_ONESHOT_REALTIME); @@ -187,44 +175,88 @@ PeerInteractionCommand::PeerInteractionCommand 1+(requestGroup_->getDownloadContext()->getNumPieces()+7)/8; peerConnection->reserveBuffer(bitfieldPayloadSize); - DefaultBtMessageDispatcher* dispatcherPtr(new DefaultBtMessageDispatcher()); - dispatcherPtr->setCuid(cuid); - dispatcherPtr->setPeer(getPeer()); - dispatcherPtr->setDownloadContext(requestGroup_->getDownloadContext().get()); - dispatcherPtr->setPieceStorage(pieceStorage.get()); - dispatcherPtr->setPeerStorage(peerStorage.get()); - dispatcherPtr->setRequestTimeout(getOption()-> + auto dispatcher = make_unique(); + auto dispatcherPtr = dispatcher.get(); + dispatcher->setCuid(cuid); + dispatcher->setPeer(getPeer()); + dispatcher->setDownloadContext(requestGroup_->getDownloadContext().get()); + dispatcher->setPieceStorage(pieceStorage.get()); + dispatcher->setPeerStorage(peerStorage.get()); + dispatcher->setRequestTimeout(getOption()-> getAsInt(PREF_BT_REQUEST_TIMEOUT)); - dispatcherPtr->setBtMessageFactory(factoryPtr); - dispatcherPtr->setRequestGroupMan + dispatcher->setBtMessageFactory(factory.get()); + dispatcher->setRequestGroupMan (getDownloadEngine()->getRequestGroupMan().get()); - dispatcherPtr->setPeerConnection(peerConnection.get()); - std::shared_ptr dispatcher(dispatcherPtr); + dispatcher->setPeerConnection(peerConnection.get()); - DefaultBtMessageReceiver* receiverPtr(new DefaultBtMessageReceiver()); - std::shared_ptr receiver(receiverPtr); - receiverPtr->setDownloadContext(requestGroup_->getDownloadContext().get()); - receiverPtr->setPeerConnection(peerConnection.get()); - receiverPtr->setDispatcher(dispatcherPtr); - receiverPtr->setBtMessageFactory(factoryPtr); + auto receiver = make_unique(); + receiver->setDownloadContext(requestGroup_->getDownloadContext().get()); + receiver->setPeerConnection(peerConnection.get()); + receiver->setDispatcher(dispatcher.get()); + receiver->setBtMessageFactory(factory.get()); - DefaultBtRequestFactory* reqFactoryPtr(new DefaultBtRequestFactory()); - reqFactoryPtr->setPeer(getPeer()); - reqFactoryPtr->setPieceStorage(pieceStorage.get()); - reqFactoryPtr->setBtMessageDispatcher(dispatcherPtr); - reqFactoryPtr->setBtMessageFactory(factoryPtr); - reqFactoryPtr->setCuid(cuid); - std::shared_ptr reqFactory(reqFactoryPtr); + auto reqFactory = make_unique(); + reqFactory->setPeer(getPeer()); + reqFactory->setPieceStorage(pieceStorage.get()); + reqFactory->setBtMessageDispatcher(dispatcher.get()); + reqFactory->setBtMessageFactory(factory.get()); + reqFactory->setCuid(cuid); // reverse depends - factoryPtr->setBtMessageDispatcher(dispatcherPtr); - factoryPtr->setBtRequestFactory(reqFactoryPtr); - factoryPtr->setPeerConnection(peerConnection.get()); + factory->setBtMessageDispatcher(dispatcher.get()); + factory->setBtRequestFactory(reqFactory.get()); + factory->setPeerConnection(peerConnection.get()); - extensionMessageFactory->setBtMessageDispatcher(dispatcherPtr); - extensionMessageFactory->setBtMessageFactory(factoryPtr); + extensionMessageFactory->setBtMessageDispatcher(dispatcher.get()); + extensionMessageFactory->setBtMessageFactory(factory.get()); + + getPeer()->allocateSessionResource + (requestGroup_->getDownloadContext()->getPieceLength(), + requestGroup_->getDownloadContext()->getTotalLength()); + getPeer()->setBtMessageDispatcher(dispatcher.get()); + + auto btInteractive = make_unique + (requestGroup_->getDownloadContext(), getPeer()); + btInteractive->setBtRuntime(btRuntime_); + btInteractive->setPieceStorage(pieceStorage_); + btInteractive->setPeerStorage(peerStorage); // Note: Not a member variable. + btInteractive->setCuid(cuid); + btInteractive->setBtMessageReceiver(std::move(receiver)); + btInteractive->setDispatcher(std::move(dispatcher)); + btInteractive->setBtRequestFactory(std::move(reqFactory)); + btInteractive->setPeerConnection(std::move(peerConnection)); + btInteractive->setExtensionMessageFactory + (std::move(extensionMessageFactory)); + btInteractive->setExtensionMessageRegistry(std::move(exMsgRegistry)); + btInteractive->setKeepAliveInterval + (getOption()->getAsInt(PREF_BT_KEEP_ALIVE_INTERVAL)); + btInteractive->setRequestGroupMan + (getDownloadEngine()->getRequestGroupMan().get()); + btInteractive->setBtMessageFactory(std::move(factory)); + if((metadataGetMode || !torrentAttrs->privateTorrent) && + !getPeer()->isLocalPeer()) { + if(getOption()->getAsBool(PREF_ENABLE_PEER_EXCHANGE)) { + btInteractive->setUTPexEnabled(true); + } + if(family == AF_INET) { + if(DHTRegistry::isInitialized()) { + btInteractive->setDHTEnabled(true); + factoryPtr->setDHTEnabled(true); + btInteractive->setLocalNode(DHTRegistry::getData().localNode.get()); + } + } else { + if(DHTRegistry::isInitialized6()) { + btInteractive->setDHTEnabled(true); + factoryPtr->setDHTEnabled(true); + btInteractive->setLocalNode(DHTRegistry::getData6().localNode.get()); + } + } + } if(metadataGetMode) { + auto utMetadataRequestFactory = make_unique(); + auto utMetadataRequestTracker = make_unique(); + utMetadataRequestFactory->setCuid(cuid); utMetadataRequestFactory->setDownloadContext (requestGroup_->getDownloadContext().get()); @@ -233,60 +265,21 @@ PeerInteractionCommand::PeerInteractionCommand utMetadataRequestFactory->setPeer(getPeer()); utMetadataRequestFactory->setUTMetadataRequestTracker (utMetadataRequestTracker.get()); + + extensionMessageFactoryPtr->setUTMetadataRequestTracker + (utMetadataRequestTracker.get()); + + btInteractive->setUTMetadataRequestFactory + (std::move(utMetadataRequestFactory)); + btInteractive->setUTMetadataRequestTracker + (std::move(utMetadataRequestTracker)); } - getPeer()->allocateSessionResource - (requestGroup_->getDownloadContext()->getPieceLength(), - requestGroup_->getDownloadContext()->getTotalLength()); - getPeer()->setBtMessageDispatcher(dispatcherPtr); - - DefaultBtInteractive* btInteractivePtr - (new DefaultBtInteractive(requestGroup_->getDownloadContext(), getPeer())); - btInteractivePtr->setBtRuntime(btRuntime_); - btInteractivePtr->setPieceStorage(pieceStorage_); - btInteractivePtr->setPeerStorage(peerStorage); // Note: Not a member variable. - btInteractivePtr->setCuid(cuid); - btInteractivePtr->setBtMessageReceiver(receiver); - btInteractivePtr->setDispatcher(dispatcher); - btInteractivePtr->setBtRequestFactory(reqFactory); - btInteractivePtr->setPeerConnection(peerConnection); - btInteractivePtr->setExtensionMessageFactory - (std::move(extensionMessageFactory)); - btInteractivePtr->setExtensionMessageRegistry(exMsgRegistry); - btInteractivePtr->setKeepAliveInterval - (getOption()->getAsInt(PREF_BT_KEEP_ALIVE_INTERVAL)); - btInteractivePtr->setRequestGroupMan - (getDownloadEngine()->getRequestGroupMan().get()); - btInteractivePtr->setBtMessageFactory(factory); - if((metadataGetMode || !torrentAttrs->privateTorrent) && - !getPeer()->isLocalPeer()) { - if(getOption()->getAsBool(PREF_ENABLE_PEER_EXCHANGE)) { - btInteractivePtr->setUTPexEnabled(true); - } - if(family == AF_INET) { - if(DHTRegistry::isInitialized()) { - btInteractivePtr->setDHTEnabled(true); - factoryPtr->setDHTEnabled(true); - btInteractivePtr->setLocalNode(DHTRegistry::getData().localNode.get()); - } - } else { - if(DHTRegistry::isInitialized6()) { - btInteractivePtr->setDHTEnabled(true); - factoryPtr->setDHTEnabled(true); - btInteractivePtr->setLocalNode(DHTRegistry::getData6().localNode.get()); - } - } - } - btInteractivePtr->setUTMetadataRequestFactory(utMetadataRequestFactory); - btInteractivePtr->setUTMetadataRequestTracker(utMetadataRequestTracker); - btInteractivePtr->setTcpPort(e->getBtRegistry()->getTcpPort()); + btInteractive->setTcpPort(e->getBtRegistry()->getTcpPort()); if(metadataGetMode) { - btInteractivePtr->enableMetadataGetMode(); + btInteractive->enableMetadataGetMode(); } - std::shared_ptr btInteractive(btInteractivePtr); - - btInteractive_ = btInteractive; - + btInteractive_ = std::move(btInteractive); btRuntime_->increaseConnections(); requestGroup_->increaseNumCommand(); diff --git a/src/PeerInteractionCommand.h b/src/PeerInteractionCommand.h index f31326b8..e59e561e 100644 --- a/src/PeerInteractionCommand.h +++ b/src/PeerInteractionCommand.h @@ -64,7 +64,7 @@ private: std::shared_ptr peerStorage_; Seq sequence_; - std::shared_ptr btInteractive_; + std::unique_ptr btInteractive_; const std::shared_ptr