X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/ea74f5d95928a521a588737e81f1de94eef25d19..24760d83c71aa79e6aab9d3922d30a607a6cf7da:/examples/cpp/app-bittorrent/s4u-peer.cpp diff --git a/examples/cpp/app-bittorrent/s4u-peer.cpp b/examples/cpp/app-bittorrent/s4u-peer.cpp index 7de17e9023..43f7f46a74 100644 --- a/examples/cpp/app-bittorrent/s4u-peer.cpp +++ b/examples/cpp/app-bittorrent/s4u-peer.cpp @@ -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. */ @@ -11,6 +11,7 @@ #include "s4u-tracker.hpp" XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_bt_peer, "Messages specific for the peers"); +namespace sg4 = simgrid::s4u; /* * User parameters for transferred file data. For the test, the default values are : @@ -42,14 +43,14 @@ constexpr unsigned message_size(MessageType type) /* REQUEST */ 17, /* PIECE */ 13, /* CANCEL */ 17}}; - return sizes[static_cast(type)]; + return sizes.at(static_cast(type)); } constexpr const char* message_name(MessageType type) { constexpr std::array names{{"HANDSHAKE", "CHOKE", "UNCHOKE", "INTERESTED", "NOTINTERESTED", "HAVE", "BITFIELD", "REQUEST", "PIECE", "CANCEL"}}; - return names[static_cast(type)]; + return names.at(static_cast(type)); } Peer::Peer(std::vector args) @@ -58,7 +59,7 @@ Peer::Peer(std::vector args) xbt_assert(args.size() == 3 || args.size() == 4, "Wrong number of arguments"); try { id = std::stoi(args[1]); - mailbox_ = simgrid::s4u::Mailbox::by_name(std::to_string(id)); + mailbox_ = sg4::Mailbox::by_name(std::to_string(id)); } catch (const std::invalid_argument&) { throw std::invalid_argument("Invalid ID:" + args[1]); } @@ -86,8 +87,8 @@ void Peer::operator()() // Getting peer data from the tracker. if (getPeersFromTracker()) { XBT_DEBUG("Got %zu peers from the tracker. Current status is: %s", connected_peers.size(), getStatus().c_str()); - begin_receive_time = simgrid::s4u::Engine::get_clock(); - mailbox_->set_receiver(simgrid::s4u::Actor::self()); + begin_receive_time = sg4::Engine::get_clock(); + mailbox_->set_receiver(sg4::Actor::self()); if (hasFinished()) { sendHandshakeToAllPeers(); } else { @@ -103,7 +104,7 @@ void Peer::operator()() bool Peer::getPeersFromTracker() { - simgrid::s4u::Mailbox* tracker_mailbox = simgrid::s4u::Mailbox::by_name(TRACKER_MAILBOX); + sg4::Mailbox* tracker_mailbox = sg4::Mailbox::by_name(TRACKER_MAILBOX); // Build the task to send to the tracker auto* peer_request = new TrackerQuery(id, mailbox_); try { @@ -120,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; @@ -130,21 +131,20 @@ 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); } } -void Peer::sendMessage(simgrid::s4u::Mailbox* mailbox, MessageType type, uint64_t size) +void Peer::sendMessage(sg4::Mailbox* mailbox, MessageType type, uint64_t size) { XBT_DEBUG("Sending %s to %s", message_name(type), mailbox->get_cname()); mailbox->put_init(new Message(type, id, bitfield_, mailbox_), size)->detach(); } -void Peer::sendBitfield(simgrid::s4u::Mailbox* mailbox) +void Peer::sendBitfield(sg4::Mailbox* mailbox) { XBT_DEBUG("Sending a BITFIELD to %s", mailbox->get_cname()); mailbox @@ -153,7 +153,7 @@ void Peer::sendBitfield(simgrid::s4u::Mailbox* mailbox) ->detach(); } -void Peer::sendPiece(simgrid::s4u::Mailbox* mailbox, unsigned int piece, int block_index, int block_length) +void Peer::sendPiece(sg4::Mailbox* mailbox, unsigned int piece, int block_index, int block_length) { xbt_assert(not hasNotPiece(piece), "Tried to send a unavailable piece."); XBT_DEBUG("Sending the PIECE %u (%d,%d) to %s", piece, block_index, block_length, mailbox->get_cname()); @@ -164,8 +164,7 @@ void Peer::sendPiece(simgrid::s4u::Mailbox* mailbox, unsigned int piece, int blo 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(); } @@ -240,14 +239,14 @@ int Peer::nbInterestedPeers() const void Peer::leech() { - double next_choked_update = simgrid::s4u::Engine::get_clock() + UPDATE_CHOKED_INTERVAL; + double next_choked_update = sg4::Engine::get_clock() + UPDATE_CHOKED_INTERVAL; XBT_DEBUG("Start downloading."); /* Send a "handshake" message to all the peers it got (since it couldn't have gotten more than 50 peers) */ sendHandshakeToAllPeers(); XBT_DEBUG("Starting main leech loop listening on mailbox: %s", mailbox_->get_cname()); - while (simgrid::s4u::Engine::get_clock() < deadline && countPieces(bitfield_) < FILE_PIECES) { + while (sg4::Engine::get_clock() < deadline && countPieces(bitfield_) < FILE_PIECES) { if (comm_received == nullptr) { comm_received = mailbox_->get_async(&message); } @@ -257,11 +256,11 @@ void Peer::leech() comm_received = nullptr; } else { // We don't execute the choke algorithm if we don't already have a piece - if (simgrid::s4u::Engine::get_clock() >= next_choked_update && countPieces(bitfield_) > 0) { + if (sg4::Engine::get_clock() >= next_choked_update && countPieces(bitfield_) > 0) { updateChokedPeers(); next_choked_update += UPDATE_CHOKED_INTERVAL; } else { - simgrid::s4u::this_actor::sleep_for(SLEEP_DURATION); + sg4::this_actor::sleep_for(SLEEP_DURATION); } } } @@ -271,10 +270,10 @@ void Peer::leech() void Peer::seed() { - double next_choked_update = simgrid::s4u::Engine::get_clock() + UPDATE_CHOKED_INTERVAL; + double next_choked_update = sg4::Engine::get_clock() + UPDATE_CHOKED_INTERVAL; XBT_DEBUG("Start seeding."); // start the main seed loop - while (simgrid::s4u::Engine::get_clock() < deadline) { + while (sg4::Engine::get_clock() < deadline) { if (comm_received == nullptr) { comm_received = mailbox_->get_async(&message); } @@ -283,12 +282,12 @@ void Peer::seed() delete message; comm_received = nullptr; } else { - if (simgrid::s4u::Engine::get_clock() >= next_choked_update) { + if (sg4::Engine::get_clock() >= next_choked_update) { updateChokedPeers(); // TODO: Change the choked peer algorithm when seeding. next_choked_update += UPDATE_CHOKED_INTERVAL; } else { - simgrid::s4u::this_actor::sleep_for(SLEEP_DURATION); + sg4::this_actor::sleep_for(SLEEP_DURATION); } } } @@ -316,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 @@ -418,9 +417,9 @@ void Peer::handleMessage() } // Update the peer speed. if (remote_peer) { - remote_peer->addSpeedValue(1.0 / (simgrid::s4u::Engine::get_clock() - begin_receive_time)); + remote_peer->addSpeedValue(1.0 / (sg4::Engine::get_clock() - begin_receive_time)); } - begin_receive_time = simgrid::s4u::Engine::get_clock(); + begin_receive_time = sg4::Engine::get_clock(); } /** Selects the appropriate piece to download and requests it to the remote_peer */ @@ -556,9 +555,8 @@ void Peer::updateChokedPeers() /**If we are currently seeding, we unchoke the peer which has been unchoked the last time.*/ if (hasFinished()) { - double unchoke_time = simgrid::s4u::Engine::get_clock() + 1; - for (auto& kv : connected_peers) { - Connection& remote_peer = kv.second; + double unchoke_time = sg4::Engine::get_clock() + 1; + 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; @@ -582,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; @@ -608,7 +605,7 @@ void Peer::updateChokedPeers() xbt_assert((chosen_peer->choked_upload), "Tries to unchoked an unchoked peer"); chosen_peer->choked_upload = false; active_peers.insert(chosen_peer); - chosen_peer->last_unchoke = simgrid::s4u::Engine::get_clock(); + chosen_peer->last_unchoke = sg4::Engine::get_clock(); XBT_DEBUG("(%d) Sending a UNCHOKE to %d", id, chosen_peer->id); updateActivePeersSet(chosen_peer); sendMessage(chosen_peer->mailbox_, MessageType::UNCHOKE, message_size(MessageType::UNCHOKE)); @@ -619,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.