Use std::unique_ptr for LpdMessage instead of std::shared_ptr

pull/103/head
Tatsuhiro Tsujikawa 2013-07-04 00:56:29 +09:00
parent 57f1902ee1
commit c36370ef60
4 changed files with 15 additions and 17 deletions

View File

@ -55,7 +55,7 @@ LpdMessageReceiver::~LpdMessageReceiver() {}
bool LpdMessageReceiver::init(const std::string& localAddr) bool LpdMessageReceiver::init(const std::string& localAddr)
{ {
try { try {
socket_.reset(new SocketCore(SOCK_DGRAM)); socket_ = std::make_shared<SocketCore>(SOCK_DGRAM);
#ifdef __MINGW32__ #ifdef __MINGW32__
// Binding multicast address fails under Windows. // Binding multicast address fails under Windows.
socket_->bindWithFamily(multicastPort_, AF_INET); socket_->bindWithFamily(multicastPort_, AF_INET);
@ -77,9 +77,8 @@ bool LpdMessageReceiver::init(const std::string& localAddr)
return false; return false;
} }
std::shared_ptr<LpdMessage> LpdMessageReceiver::receiveMessage() std::unique_ptr<LpdMessage> LpdMessageReceiver::receiveMessage()
{ {
std::shared_ptr<LpdMessage> msg;
while(1) { while(1) {
unsigned char buf[200]; unsigned char buf[200];
std::pair<std::string, uint16_t> peerAddr; std::pair<std::string, uint16_t> peerAddr;
@ -87,11 +86,11 @@ std::shared_ptr<LpdMessage> LpdMessageReceiver::receiveMessage()
try { try {
length = socket_->readDataFrom(buf, sizeof(buf), peerAddr); length = socket_->readDataFrom(buf, sizeof(buf), peerAddr);
if(length == 0) { if(length == 0) {
return msg; return std::unique_ptr<LpdMessage>{};
} }
} catch(RecoverableException& e) { } catch(RecoverableException& e) {
A2_LOG_INFO_EX("Failed to receive LPD message.", e); A2_LOG_INFO_EX("Failed to receive LPD message.", e);
return msg; return std::unique_ptr<LpdMessage>{};
} }
HttpHeaderProcessor proc(HttpHeaderProcessor::SERVER_PARSER); HttpHeaderProcessor proc(HttpHeaderProcessor::SERVER_PARSER);
try { try {
@ -103,7 +102,7 @@ std::shared_ptr<LpdMessage> LpdMessageReceiver::receiveMessage()
A2_LOG_INFO_EX("Failed to parse LPD message.", e); A2_LOG_INFO_EX("Failed to parse LPD message.", e);
continue; continue;
} }
const std::shared_ptr<HttpHeader>& header = proc.getResult(); auto header = proc.getResult();
const std::string& infoHashString = header->find(HttpHeader::INFOHASH); const std::string& infoHashString = header->find(HttpHeader::INFOHASH);
uint32_t port = 0; uint32_t port = 0;
if(!util::parseUIntNoThrow(port, header->find(HttpHeader::PORT)) || if(!util::parseUIntNoThrow(port, header->find(HttpHeader::PORT)) ||
@ -123,12 +122,11 @@ std::shared_ptr<LpdMessage> LpdMessageReceiver::receiveMessage()
infoHashString.c_str())); infoHashString.c_str()));
continue; continue;
} }
std::shared_ptr<Peer> peer(new Peer(peerAddr.first, port, false)); auto peer = std::make_shared<Peer>(peerAddr.first, port, false);
if(util::inPrivateAddress(peerAddr.first)) { if(util::inPrivateAddress(peerAddr.first)) {
peer->setLocalPeer(true); peer->setLocalPeer(true);
} }
msg.reset(new LpdMessage(peer, infoHash)); return make_unique<LpdMessage>(peer, infoHash);
return msg;
} }
} }

View File

@ -63,7 +63,7 @@ public:
// sender(peer) and infohash. If no data is available on socket, // sender(peer) and infohash. If no data is available on socket,
// returns std::shared_ptr<LpdMessage>(). If received data is bad, // returns std::shared_ptr<LpdMessage>(). If received data is bad,
// then returns std::shared_ptr<LpdMessage>(new LpdMessage()) // then returns std::shared_ptr<LpdMessage>(new LpdMessage())
std::shared_ptr<LpdMessage> receiveMessage(); std::unique_ptr<LpdMessage> receiveMessage();
const std::shared_ptr<SocketCore>& getSocket() const const std::shared_ptr<SocketCore>& getSocket() const
{ {

View File

@ -73,12 +73,12 @@ bool LpdReceiveMessageCommand::execute()
return true; return true;
} }
for(size_t i = 0; i < 20; ++i) { for(size_t i = 0; i < 20; ++i) {
std::shared_ptr<LpdMessage> m = receiver_->receiveMessage(); auto m = receiver_->receiveMessage();
if(!m) { if(!m) {
break; break;
} }
std::shared_ptr<BtRegistry> reg = e_->getBtRegistry(); auto& reg = e_->getBtRegistry();
std::shared_ptr<DownloadContext> dctx = reg->getDownloadContext(m->infoHash); auto& dctx = reg->getDownloadContext(m->infoHash);
if(!dctx) { if(!dctx) {
A2_LOG_DEBUG(fmt("Download Context is null for infohash=%s.", A2_LOG_DEBUG(fmt("Download Context is null for infohash=%s.",
util::toHex(m->infoHash).c_str())); util::toHex(m->infoHash).c_str()));
@ -90,11 +90,11 @@ bool LpdReceiveMessageCommand::execute()
} }
RequestGroup* group = dctx->getOwnerRequestGroup(); RequestGroup* group = dctx->getOwnerRequestGroup();
assert(group); assert(group);
const std::shared_ptr<BtObject>& btobj = reg->get(group->getGID()); auto& btobj = reg->get(group->getGID());
assert(btobj); assert(btobj);
const std::shared_ptr<PeerStorage>& peerStorage = btobj->peerStorage; auto& peerStorage = btobj->peerStorage;
assert(peerStorage); assert(peerStorage);
std::shared_ptr<Peer> peer = m->peer; auto& peer = m->peer;
if(peerStorage->addPeer(peer)) { if(peerStorage->addPeer(peer)) {
A2_LOG_DEBUG(fmt("LPD peer %s:%u local=%d added.", A2_LOG_DEBUG(fmt("LPD peer %s:%u local=%d added.",
peer->getIPAddress().c_str(), peer->getPort(), peer->getIPAddress().c_str(), peer->getPort(),

View File

@ -50,7 +50,7 @@ void LpdMessageReceiverTest::testReceiveMessage()
LPD_MULTICAST_ADDR, LPD_MULTICAST_PORT); LPD_MULTICAST_ADDR, LPD_MULTICAST_PORT);
rcv.getSocket()->isReadable(5); rcv.getSocket()->isReadable(5);
std::shared_ptr<LpdMessage> msg = rcv.receiveMessage(); auto msg = rcv.receiveMessage();
CPPUNIT_ASSERT(msg); CPPUNIT_ASSERT(msg);
CPPUNIT_ASSERT_EQUAL(std::string("cd41c7fdddfd034a15a04d7ff881216e01c4ceaf"), CPPUNIT_ASSERT_EQUAL(std::string("cd41c7fdddfd034a15a04d7ff881216e01c4ceaf"),
util::toHex(msg->infoHash)); util::toHex(msg->infoHash));