Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
smpi: fix issue with message IDs. In case of persistent request reused multiple times...
[simgrid.git] / examples / cpp / app-bittorrent / s4u-peer.cpp
index a2169a1cdf63714faafecefa75876da71f3f4796..43f7f46a74dae075121d3a0477bb3faef158c934 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2022. The SimGrid Team. All rights reserved.          */
+/* Copyright (c) 2012-2023. The SimGrid Team. All rights reserved.          */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
@@ -43,14 +43,14 @@ constexpr unsigned message_size(MessageType type)
                                             /* REQUEST       */ 17,
                                             /* PIECE         */ 13,
                                             /* CANCEL        */ 17}};
-  return sizes[static_cast<int>(type)];
+  return sizes.at(static_cast<int>(type));
 }
 
 constexpr const char* message_name(MessageType type)
 {
   constexpr std::array<const char*, 10> names{{"HANDSHAKE", "CHOKE", "UNCHOKE", "INTERESTED", "NOTINTERESTED", "HAVE",
                                                "BITFIELD", "REQUEST", "PIECE", "CANCEL"}};
-  return names[static_cast<int>(type)];
+  return names.at(static_cast<int>(type));
 }
 
 Peer::Peer(std::vector<std::string> args)
@@ -121,7 +121,7 @@ bool Peer::getPeersFromTracker()
     // Add the peers the tracker gave us to our peer list.
     for (auto const& peer_id : answer->getPeers())
       if (id != peer_id)
-        connected_peers.emplace(peer_id, Connection(peer_id));
+        connected_peers.try_emplace(peer_id, peer_id);
   } catch (const simgrid::TimeoutException&) {
     XBT_DEBUG("Timeout expired when requesting peers to tracker");
     return false;
@@ -131,8 +131,7 @@ bool Peer::getPeersFromTracker()
 
 void Peer::sendHandshakeToAllPeers()
 {
-  for (auto const& kv : connected_peers) {
-    const Connection& remote_peer = kv.second;
+  for (auto const& [_, remote_peer] : connected_peers) {
     auto* handshake               = new Message(MessageType::HANDSHAKE, id, mailbox_);
     remote_peer.mailbox_->put_init(handshake, message_size(MessageType::HANDSHAKE))->detach();
     XBT_DEBUG("Sending a HANDSHAKE to %d", remote_peer.id);
@@ -165,8 +164,7 @@ void Peer::sendPiece(sg4::Mailbox* mailbox, unsigned int piece, int block_index,
 void Peer::sendHaveToAllPeers(unsigned int piece)
 {
   XBT_DEBUG("Sending HAVE message to all my peers");
-  for (auto const& kv : connected_peers) {
-    const Connection& remote_peer = kv.second;
+  for (auto const& [_, remote_peer] : connected_peers) {
     remote_peer.mailbox_->put_init(new Message(MessageType::HAVE, id, mailbox_, piece), message_size(MessageType::HAVE))
         ->detach();
   }
@@ -317,7 +315,7 @@ void Peer::handleMessage()
       // Check if the peer is in our connection list.
       if (remote_peer == nullptr) {
         XBT_DEBUG("This peer %d was unknown, answer to its handshake", message->peer_id);
-        connected_peers.emplace(message->peer_id, Connection(message->peer_id));
+        connected_peers.try_emplace(message->peer_id, message->peer_id);
         sendMessage(message->return_mailbox, MessageType::HANDSHAKE, message_size(MessageType::HANDSHAKE));
       }
       // Send our bitfield to the peer
@@ -558,8 +556,7 @@ void Peer::updateChokedPeers()
   /**If we are currently seeding, we unchoke the peer which has been unchoked the last time.*/
   if (hasFinished()) {
     double unchoke_time = sg4::Engine::get_clock() + 1;
-    for (auto& kv : connected_peers) {
-      Connection& remote_peer = kv.second;
+    for (auto& [_, remote_peer] : connected_peers) {
       if (remote_peer.last_unchoke < unchoke_time && remote_peer.interested && remote_peer.choked_upload) {
         unchoke_time = remote_peer.last_unchoke;
         chosen_peer  = &remote_peer;
@@ -583,8 +580,7 @@ void Peer::updateChokedPeers()
     } else {
       // Use the "fastest download" policy.
       double fastest_speed = 0.0;
-      for (auto& kv : connected_peers) {
-        Connection& remote_peer = kv.second;
+      for (auto& [_, remote_peer] : connected_peers) {
         if (remote_peer.peer_speed > fastest_speed && remote_peer.choked_upload && remote_peer.interested) {
           fastest_speed = remote_peer.peer_speed;
           chosen_peer   = &remote_peer;
@@ -620,8 +616,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) {
-    Connection& remote_peer = kv.second;
+  for (auto& [_, remote_peer] : connected_peers) {
     if (remote_peer.am_interested) {
       bool interested = false;
       // Check if the peer still has a piece we want.