#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
Peer::~Peer()
{
- for (auto peer : connected_peers)
+ for (auto const& peer : connected_peers)
delete peer.second;
delete[] pieces_count;
}
{
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);
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;
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();
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();
}
int Peer::nbInterestedPeers()
{
int nb = 0;
- for (auto kv : connected_peers)
+ for (auto const& kv : connected_peers)
if (kv.second->interested)
nb++;
return nb;
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;
} 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;
/** @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;
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;
}