summaryrefslogtreecommitdiff
path: root/src/DefaultPeerStorage.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2016-08-20 18:49:19 +0900
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2016-08-20 18:49:19 +0900
commit7a31f9bf29c6b89aed2a216d0159d6f43369e8a2 (patch)
tree08c809cbc416ef1b2d1265ca75481e61b9924dba /src/DefaultPeerStorage.cc
parentc42fa9f20c81e551e63dbc1970186461e102f39c (diff)
Make assertion hold
If we have peer which is already used, make addAndCheckoutPeer() fail. If peer is in unused list, first remove the old entry, and then add new one. This would make assertion in ~DefaultPeerStorage hold.
Diffstat (limited to 'src/DefaultPeerStorage.cc')
-rw-r--r--src/DefaultPeerStorage.cc18
1 files changed, 17 insertions, 1 deletions
diff --git a/src/DefaultPeerStorage.cc b/src/DefaultPeerStorage.cc
index 0f5baa65..b4a9fc00 100644
--- a/src/DefaultPeerStorage.cc
+++ b/src/DefaultPeerStorage.cc
@@ -164,8 +164,24 @@ std::shared_ptr<Peer>
DefaultPeerStorage::addAndCheckoutPeer(const std::shared_ptr<Peer>& peer,
cuid_t cuid)
{
+ if (isPeerAlreadyAdded(peer)) {
+ auto it = std::find_if(std::begin(unusedPeers_), std::end(unusedPeers_),
+ [&peer](const std::shared_ptr<Peer>& p) {
+ return p->getIPAddress() == peer->getIPAddress() &&
+ p->getOrigPort() == peer->getOrigPort();
+ });
+ if (it == std::end(unusedPeers_)) {
+ // peer is in usedPeers_.
+ return nullptr;
+ }
+
+ unusedPeers_.erase(it);
+ }
+ else {
+ addUniqPeer(peer);
+ }
+
unusedPeers_.push_front(peer);
- addUniqPeer(peer);
return checkoutPeer(cuid);
}