Browse Source

Fix warning "Cannot fid peer ... in usedPeers_"

Tatsuhiro Tsujikawa 9 years ago
parent
commit
4df7b540a2

+ 10 - 0
src/DefaultPeerStorage.cc

@@ -160,6 +160,16 @@ void DefaultPeerStorage::addPeer(
                    static_cast<unsigned long>(unusedPeers_.size())));
                    static_cast<unsigned long>(unusedPeers_.size())));
 }
 }
 
 
+std::shared_ptr<Peer>
+DefaultPeerStorage::addAndCheckoutPeer(const std::shared_ptr<Peer>& peer,
+                                       cuid_t cuid)
+{
+  unusedPeers_.push_front(peer);
+  addUniqPeer(peer);
+
+  return checkoutPeer(cuid);
+}
+
 void DefaultPeerStorage::addDroppedPeer(const std::shared_ptr<Peer>& peer)
 void DefaultPeerStorage::addDroppedPeer(const std::shared_ptr<Peer>& peer)
 {
 {
   // Make sure that no duplicated peer exists in droppedPeers_. If
   // Make sure that no duplicated peer exists in droppedPeers_. If

+ 3 - 0
src/DefaultPeerStorage.h

@@ -94,6 +94,9 @@ public:
   virtual void
   virtual void
   addPeer(const std::vector<std::shared_ptr<Peer>>& peers) CXX11_OVERRIDE;
   addPeer(const std::vector<std::shared_ptr<Peer>>& peers) CXX11_OVERRIDE;
 
 
+  std::shared_ptr<Peer> addAndCheckoutPeer(const std::shared_ptr<Peer>& peer,
+                                           cuid_t cuid);
+
   const std::deque<std::shared_ptr<Peer>>& getUnusedPeers();
   const std::deque<std::shared_ptr<Peer>>& getUnusedPeers();
 
 
   virtual const PeerSet& getUsedPeers() CXX11_OVERRIDE;
   virtual const PeerSet& getUsedPeers() CXX11_OVERRIDE;

+ 1 - 2
src/PeerReceiveHandshakeCommand.cc

@@ -136,8 +136,7 @@ bool PeerReceiveHandshakeCommand::executeInternal()
         btRuntime->lessThanMaxPeers()) {
         btRuntime->lessThanMaxPeers()) {
       // TODO addPeer and checkoutPeer must be "atomic", in a sense
       // TODO addPeer and checkoutPeer must be "atomic", in a sense
       // that the added peer must be checked out.
       // that the added peer must be checked out.
-      if (peerStorage->addPeer(getPeer()) &&
-          peerStorage->checkoutPeer(getCuid())) {
+      if (peerStorage->addAndCheckoutPeer(getPeer(), getCuid())) {
         getDownloadEngine()->addCommand(make_unique<PeerInteractionCommand>(
         getDownloadEngine()->addCommand(make_unique<PeerInteractionCommand>(
             getCuid(), downloadContext->getOwnerRequestGroup(), getPeer(),
             getCuid(), downloadContext->getOwnerRequestGroup(), getPeer(),
             getDownloadEngine(), btRuntime, pieceStorage, peerStorage,
             getDownloadEngine(), btRuntime, pieceStorage, peerStorage,

+ 6 - 0
src/PeerStorage.h

@@ -67,6 +67,12 @@ public:
    */
    */
   virtual void addPeer(const std::vector<std::shared_ptr<Peer>>& peers) = 0;
   virtual void addPeer(const std::vector<std::shared_ptr<Peer>>& peers) = 0;
 
 
+  /**
+   * Adds new peer, and checkout it atomically.
+   */
+  virtual std::shared_ptr<Peer>
+  addAndCheckoutPeer(const std::shared_ptr<Peer>& peer, cuid_t cuid) = 0;
+
   /**
   /**
    * Returns the number of peers, including used and unused ones.
    * Returns the number of peers, including used and unused ones.
    */
    */

+ 7 - 0
test/MockPeerStorage.h

@@ -38,6 +38,13 @@ public:
     return unusedPeers;
     return unusedPeers;
   }
   }
 
 
+  virtual std::shared_ptr<Peer>
+  addAndCheckoutPeer(const std::shared_ptr<Peer>& peer, cuid_t cuid)
+  {
+    unusedPeers.push_back(peer);
+    return nullptr;
+  }
+
   virtual size_t countAllPeer() const CXX11_OVERRIDE
   virtual size_t countAllPeer() const CXX11_OVERRIDE
   {
   {
     return unusedPeers.size() + usedPeers.size();
     return unusedPeers.size() + usedPeers.size();