Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Use (const) references with range-based for loops.
[simgrid.git] / examples / s4u / app-bittorrent / s4u_peer.cpp
index 04bb2e4..431f433 100644 (file)
@@ -18,7 +18,6 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_bt_peer, "Messages specific for the peers");
 #define FILE_PIECES 10UL
 #define PIECES_BLOCKS 5UL
 #define BLOCK_SIZE 16384
-static const unsigned long int FILE_SIZE = FILE_PIECES * PIECES_BLOCKS * BLOCK_SIZE;
 
 /** Number of blocks asked by each request */
 #define BLOCKS_REQUESTED 2
@@ -58,7 +57,7 @@ Peer::Peer(std::vector<std::string> args)
 
 Peer::~Peer()
 {
-  for (auto peer : connected_peers)
+  for (auto const& peer : connected_peers)
     delete peer.second;
   delete[] pieces_count;
 }
@@ -88,7 +87,7 @@ bool Peer::getPeersFromTracker()
 {
   simgrid::s4u::MailboxPtr tracker_mailbox = simgrid::s4u::Mailbox::byName(TRACKER_MAILBOX);
   // Build the task to send to the tracker
-  TrackerQuery* peer_request = new TrackerQuery(id, mailbox_, 0, 0, FILE_SIZE);
+  TrackerQuery* peer_request = new TrackerQuery(id, mailbox_);
   try {
     XBT_DEBUG("Sending a peer request to the tracker.");
     tracker_mailbox->put(peer_request, TRACKER_COMM_SIZE, GET_PEERS_TIMEOUT);
@@ -103,7 +102,7 @@ bool Peer::getPeersFromTracker()
   try {
     TrackerAnswer* answer = static_cast<TrackerAnswer*>(mailbox_->get(GET_PEERS_TIMEOUT));
     // Add the peers the tracker gave us to our peer list.
-    for (auto peer_id : *answer->getPeers())
+    for (auto const& peer_id : *answer->getPeers())
       if (id != peer_id)
         connected_peers[peer_id] = new Connection(peer_id);
     delete answer;
@@ -118,7 +117,7 @@ bool Peer::getPeersFromTracker()
 
 void Peer::sendHandshakeToAllPeers()
 {
-  for (auto kv : connected_peers) {
+  for (auto const& kv : connected_peers) {
     Connection* remote_peer = kv.second;
     Message* handshake      = new Message(MESSAGE_HANDSHAKE, id, mailbox_);
     remote_peer->mailbox_->put_init(handshake, MESSAGE_HANDSHAKE_SIZE)->detach();
@@ -152,7 +151,7 @@ void Peer::sendPiece(simgrid::s4u::MailboxPtr mailbox, unsigned int piece, int b
 void Peer::sendHaveToAllPeers(unsigned int piece)
 {
   XBT_DEBUG("Sending HAVE message to all my peers");
-  for (auto kv : connected_peers) {
+  for (auto const& kv : connected_peers) {
     Connection* remote_peer = kv.second;
     remote_peer->mailbox_->put_init(new Message(MESSAGE_HAVE, id, mailbox_, piece), MESSAGE_HAVE_SIZE)->detach();
   }
@@ -221,7 +220,7 @@ unsigned int Peer::countPieces(unsigned int bitfield)
 int Peer::nbInterestedPeers()
 {
   int nb = 0;
-  for (auto kv : connected_peers)
+  for (auto const& kv : connected_peers)
     if (kv.second->interested)
       nb++;
   return nb;
@@ -547,14 +546,19 @@ void Peer::updateChokedPeers()
   round_                  = (round_ + 1) % 3;
   Connection* chosen_peer = nullptr;
   // select first active peer and remove it from the set
-  Connection* choked_peer = *(active_peers.begin());
-  active_peers.erase(choked_peer);
+  Connection* choked_peer;
+  if (active_peers.empty()) {
+    choked_peer = nullptr;
+  } else {
+    choked_peer = *active_peers.begin();
+    active_peers.erase(choked_peer);
+  }
 
   /**If we are currently seeding, we unchoke the peer which has been unchoked the last time.*/
   if (hasFinished()) {
     Connection* remote_peer;
     double unchoke_time = simgrid::s4u::Engine::getClock() + 1;
-    for (auto kv : connected_peers) {
+    for (auto const& kv : connected_peers) {
       remote_peer = kv.second;
       if (remote_peer->last_unchoke < unchoke_time && remote_peer->interested && remote_peer->choked_upload) {
         unchoke_time = remote_peer->last_unchoke;
@@ -581,7 +585,7 @@ void Peer::updateChokedPeers()
     } else {
       // Use the "fastest download" policy.
       double fastest_speed = 0.0;
-      for (auto kv : connected_peers) {
+      for (auto const& kv : connected_peers) {
         Connection* remote_peer = kv.second;
         if (remote_peer->peer_speed > fastest_speed && remote_peer->choked_upload && remote_peer->interested) {
           chosen_peer   = remote_peer;
@@ -618,7 +622,7 @@ void Peer::updateChokedPeers()
 /** @brief Update "interested" state of peers: send "not interested" to peers that don't have any more pieces we want.*/
 void Peer::updateInterestedAfterReceive()
 {
-  for (auto kv : connected_peers) {
+  for (auto const& kv : connected_peers) {
     Connection* remote_peer = kv.second;
     if (remote_peer->am_interested) {
       bool interested = false;
@@ -657,7 +661,7 @@ bool Peer::hasCompletedPiece(unsigned int piece)
 int Peer::getFirstMissingBlockFrom(int piece)
 {
   for (unsigned int i = 0; i < PIECES_BLOCKS; i++)
-    if (!(bitfield_blocks & 1ULL << (piece * PIECES_BLOCKS + i)))
+    if (not(bitfield_blocks & 1ULL << (piece * PIECES_BLOCKS + i)))
       return i;
   return -1;
 }