X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/74ffd4ad21972c63bc21b07b22df673420e0bb47..712483e35680742d6f63d087484e3abc0cf9a90e:/examples/msg/app-bittorrent/peer.c diff --git a/examples/msg/app-bittorrent/peer.c b/examples/msg/app-bittorrent/peer.c index 9469fab43a..5acba5dd24 100644 --- a/examples/msg/app-bittorrent/peer.c +++ b/examples/msg/app-bittorrent/peer.c @@ -1,5 +1,4 @@ -/* Copyright (c) 2012-2016. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2012-2016. 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. */ @@ -156,7 +155,8 @@ void seed_loop(peer_t peer, double deadline) */ int get_peers_data(peer_t peer) { - int success = 0, send_success = 0; + int success = 0; + int send_success = 0; double timeout = MSG_get_clock() + GET_PEERS_TIMEOUT; //Build the task to send to the tracker tracker_task_data_t data = tracker_task_data_new(MSG_host_get_name(MSG_host_self()), peer->mailbox_tracker, @@ -165,14 +165,14 @@ int get_peers_data(peer_t peer) msg_task_t task_send = MSG_task_create(NULL, 0, TRACKER_COMM_SIZE, data); msg_task_t task_received = NULL; msg_comm_t comm_received; - while (!send_success && MSG_get_clock() < timeout) { + while ((send_success == 0) && MSG_get_clock() < timeout) { XBT_DEBUG("Sending a peer request to the tracker."); msg_error_t status = MSG_task_send_with_timeout(task_send, TRACKER_MAILBOX, GET_PEERS_TIMEOUT); if (status == MSG_OK) { send_success = 1; } } - while (!success && MSG_get_clock() < timeout) { + while ((success ==0) && MSG_get_clock() < timeout) { comm_received = MSG_task_irecv(&task_received, peer->mailbox_tracker); msg_error_t status = MSG_comm_wait(comm_received, GET_PEERS_TIMEOUT); if (status == MSG_OK) { @@ -273,18 +273,11 @@ int nb_interested_peers(peer_t peer) void update_active_peers_set(peer_t peer, connection_t remote_peer) { - if (remote_peer->interested && !remote_peer->choked_upload) { + if ((remote_peer->interested != 0) && (remote_peer->choked_upload == 0)) { //add in the active peers set xbt_dict_set_ext(peer->active_peers, (char *) &remote_peer->id, sizeof(int), remote_peer, NULL); - } else { - //remove - xbt_ex_t e; - TRY { - xbt_dict_remove_ext(peer->active_peers, (char *) &remote_peer->id, sizeof(int)); - } - CATCH(e) { - xbt_ex_free(e); - } + } else if (xbt_dict_get_or_null_ext(peer->active_peers, (char *) &remote_peer->id, sizeof(int))) { + xbt_dict_remove_ext(peer->active_peers, (char *) &remote_peer->id, sizeof(int)); } } @@ -301,7 +294,7 @@ void handle_message(peer_t peer, msg_task_t task) case MESSAGE_HANDSHAKE: XBT_DEBUG("Received a HANDSHAKE from %s (%s)", message->mailbox, message->issuer_host_name); //Check if the peer is in our connection list. - if (!remote_peer) { + if (remote_peer == 0) { xbt_dict_set_ext(peer->peers, (char *) &message->peer_id, sizeof(int), connection_new(message->peer_id), NULL); send_handshake(peer, message->mailbox); } @@ -336,7 +329,7 @@ void handle_message(peer_t peer, msg_task_t task) case MESSAGE_UNCHOKE: xbt_assert((remote_peer != NULL), "A non-in-our-list peer has sent us a message. WTH ?"); XBT_DEBUG("Received a UNCHOKE message from %s (%s)", message->mailbox, message->issuer_host_name); - xbt_assert(remote_peer->choked_download, "WTF !!!"); + xbt_assert(remote_peer->choked_download); remote_peer->choked_download = 0; //Send requests to the peer, since it has unchoked us if (remote_peer->am_interested) @@ -345,7 +338,7 @@ void handle_message(peer_t peer, msg_task_t task) case MESSAGE_CHOKE: xbt_assert((remote_peer != NULL), "A non-in-our-list peer has sent us a message. WTH ?"); XBT_DEBUG("Received a CHOKE message from %s (%s)", message->mailbox, message->issuer_host_name); - xbt_assert(!remote_peer->choked_download, "WTF !!!"); + xbt_assert(!remote_peer->choked_download); remote_peer->choked_download = 1; remove_current_piece(peer, remote_peer, remote_peer->current_piece); break; @@ -357,18 +350,19 @@ void handle_message(peer_t peer, msg_task_t task) remote_peer->bitfield[message->index] = '1'; peer->pieces_count[message->index]++; //If the piece is in our pieces, we tell the peer that we are interested. - if (!remote_peer->am_interested && peer->bitfield[message->index] == '0') { + if ((remote_peer->am_interested == 0) && + peer->bitfield[message->index] == '0') { remote_peer->am_interested = 1; send_interested(peer, message->mailbox); - if (!remote_peer->choked_download) + if (remote_peer->choked_download == 0) request_new_piece_to_peer(peer, remote_peer); } break; case MESSAGE_REQUEST: - xbt_assert(remote_peer->interested, "WTF !!!"); + xbt_assert(remote_peer->interested); xbt_assert((message->index >= 0 && message->index < FILE_PIECES), "Wrong request received"); - if (!remote_peer->choked_upload) { + if (remote_peer->choked_upload == 0) { XBT_DEBUG("Received a REQUEST from %s (%s) for %d (%d,%d)", message->mailbox, message->issuer_host_name, message->index, message->block_index, message->block_index + message->block_length); if (peer->bitfield[message->index] == '1') { @@ -382,7 +376,7 @@ void handle_message(peer_t peer, msg_task_t task) case MESSAGE_PIECE: XBT_DEBUG("Received piece %d (%d,%d) from %s (%s)", message->index, message->block_index, message->block_index + message->block_length, message->mailbox, message->issuer_host_name); - xbt_assert(!remote_peer->choked_download, "WTF !!!"); + xbt_assert(!remote_peer->choked_download); xbt_assert(remote_peer->am_interested || ENABLE_END_GAME_MODE, "Can't received a piece if I'm not interested wihtout end-game mode!" "piece (%d) bitfield(%s) remote bitfield(%s)", message->index, peer->bitfield, remote_peer->bitfield); @@ -414,6 +408,8 @@ void handle_message(peer_t peer, msg_task_t task) case MESSAGE_CANCEL: XBT_DEBUG("The received CANCEL from %s (%s)", message->mailbox, message->issuer_host_name); break; + default: + THROW_IMPOSSIBLE; } //Update the peer speed. if (remote_peer) { @@ -437,14 +433,7 @@ void request_new_piece_to_peer(peer_t peer, connection_t remote_peer) /** remove current_piece from the list of currently downloaded pieces. */ void remove_current_piece(peer_t peer, connection_t remote_peer, int current_piece) { - int piece_index = -1, piece; - unsigned int i; - xbt_dynar_foreach(peer->current_pieces, i, piece) { - if (piece == current_piece) { - piece_index = i; - break; - } - } + int piece_index = xbt_dynar_search_or_negative(peer->current_pieces, ¤t_piece); if (piece_index != -1) xbt_dynar_remove_at(peer->current_pieces, piece_index, NULL); remote_peer->current_piece = -1; @@ -484,21 +473,23 @@ int select_piece_to_download(peer_t peer, connection_t remote_peer) return piece; // end game mode - if (xbt_dynar_length(peer->current_pieces) >= (FILE_PIECES - peer->pieces) && is_interested(peer, remote_peer)) { - if(!ENABLE_END_GAME_MODE) + if (xbt_dynar_length(peer->current_pieces) >= (FILE_PIECES - peer->pieces) && + (is_interested(peer, remote_peer) != 0)) { +#if ENABLE_END_GAME_MODE == 0 return -1; +#endif int i; int nb_interesting_pieces = 0; - int random_piece_index, current_index = 0; + int current_index = 0; // compute the number of interesting pieces for (i = 0; i < FILE_PIECES; i++) { if (peer->bitfield[i] == '0' && remote_peer->bitfield[i] == '1') { nb_interesting_pieces++; } } - xbt_assert(nb_interesting_pieces != 0, "WTF !!!"); + xbt_assert(nb_interesting_pieces != 0); // get a random interesting piece - random_piece_index = RngStream_RandInt(peer->stream, 0, nb_interesting_pieces - 1); + int random_piece_index = RngStream_RandInt(peer->stream, 0, nb_interesting_pieces - 1); for (i = 0; i < FILE_PIECES; i++) { if (peer->bitfield[i] == '0' && remote_peer->bitfield[i] == '1') { if (random_piece_index == current_index) { @@ -508,25 +499,27 @@ int select_piece_to_download(peer_t peer, connection_t remote_peer) current_index++; } } - xbt_assert(piece != -1, "WTF !!!"); + xbt_assert(piece != -1); return piece; } // Random first policy - if (peer->pieces < 4 && is_interested_and_free(peer, remote_peer)) { + if (peer->pieces < 4 && (is_interested_and_free(peer, remote_peer) != 0)) { int i; int nb_interesting_pieces = 0; - int random_piece_index, current_index = 0; + int current_index = 0; // compute the number of interesting pieces for (i = 0; i < FILE_PIECES; i++) { - if (peer->bitfield[i] == '0' && remote_peer->bitfield[i] == '1' && !in_current_pieces(peer, i)) { + if (peer->bitfield[i] == '0' && remote_peer->bitfield[i] == '1' && + (in_current_pieces(peer, i) == 0)) { nb_interesting_pieces++; } } - xbt_assert(nb_interesting_pieces != 0, "WTF !!!"); + xbt_assert(nb_interesting_pieces != 0); // get a random interesting piece - random_piece_index = RngStream_RandInt(peer->stream, 0, nb_interesting_pieces - 1); + int random_piece_index = RngStream_RandInt(peer->stream, 0, nb_interesting_pieces - 1); for (i = 0; i < FILE_PIECES; i++) { - if (peer->bitfield[i] == '0' && remote_peer->bitfield[i] == '1' && !in_current_pieces(peer, i)) { + if (peer->bitfield[i] == '0' && remote_peer->bitfield[i] == '1' && + (in_current_pieces(peer, i) == 0)) { if (random_piece_index == current_index) { piece = i; break; @@ -534,32 +527,34 @@ int select_piece_to_download(peer_t peer, connection_t remote_peer) current_index++; } } - xbt_assert(piece != -1, "WTF !!!"); + xbt_assert(piece != -1); return piece; } else { // Rarest first policy int i; short min = SHRT_MAX; int nb_min_pieces = 0; - int random_rarest_index, current_index = 0; + int current_index = 0; // compute the smallest number of copies of available pieces for (i = 0; i < FILE_PIECES; i++) { - if (peer->pieces_count[i] < min && peer->bitfield[i] == '0' && remote_peer->bitfield[i] == '1' - && !in_current_pieces(peer, i)) + if (peer->pieces_count[i] < min && peer->bitfield[i] == '0' && + remote_peer->bitfield[i] == '1' && (in_current_pieces(peer, i) == 0)) min = peer->pieces_count[i]; } - xbt_assert(min != SHRT_MAX || !is_interested_and_free(peer, remote_peer), "WTF !!!"); + xbt_assert(min != SHRT_MAX || + (is_interested_and_free(peer, remote_peer) ==0)); // compute the number of rarest pieces for (i = 0; i < FILE_PIECES; i++) { - if (peer->pieces_count[i] == min && peer->bitfield[i] == '0' && remote_peer->bitfield[i] == '1' - && !in_current_pieces(peer, i)) + if (peer->pieces_count[i] == min && peer->bitfield[i] == '0' && + remote_peer->bitfield[i] == '1' && (in_current_pieces(peer, i) ==0)) nb_min_pieces++; } - xbt_assert(nb_min_pieces != 0 || !is_interested_and_free(peer, remote_peer), "WTF !!!"); + xbt_assert(nb_min_pieces != 0 || + (is_interested_and_free(peer, remote_peer)==0)); // get a random rarest piece - random_rarest_index = RngStream_RandInt(peer->stream, 0, nb_min_pieces - 1); + int random_rarest_index = RngStream_RandInt(peer->stream, 0, nb_min_pieces - 1); for (i = 0; i < FILE_PIECES; i++) { - if (peer->pieces_count[i] == min && peer->bitfield[i] == '0' && remote_peer->bitfield[i] == '1' - && !in_current_pieces(peer, i)) { + if (peer->pieces_count[i] == min && peer->bitfield[i] == '0' && + remote_peer->bitfield[i] == '1' && (in_current_pieces(peer, i)==0)) { if (random_rarest_index == current_index) { piece = i; break; @@ -567,7 +562,7 @@ int select_piece_to_download(peer_t peer, connection_t remote_peer) current_index++; } } - xbt_assert(piece != -1 || !is_interested_and_free(peer, remote_peer), "WTF !!!"); + xbt_assert(piece != -1 || (is_interested_and_free(peer, remote_peer) == 0)); return piece; } } @@ -582,7 +577,8 @@ void update_choked_peers(peer_t peer) XBT_DEBUG("(%d) update_choked peers %d active peers", peer->id, xbt_dict_size(peer->active_peers)); //update the current round peer->round = (peer->round + 1) % 3; - char *key, *key_choked=NULL; + char *key; + char *key_choked=NULL; connection_t peer_choosed = NULL; connection_t peer_choked = NULL; //remove a peer from the list @@ -600,7 +596,8 @@ void update_choked_peers(peer_t peer) double unchoke_time = MSG_get_clock() + 1; xbt_dict_foreach(peer->peers, cursor, key, connection) { - if (connection->last_unchoke < unchoke_time && connection->interested && connection->choked_upload) { + if (connection->last_unchoke < unchoke_time && + (connection->interested != 0) && (connection->choked_upload != 0)) { unchoke_time = connection->last_unchoke; peer_choosed = connection; } @@ -622,9 +619,12 @@ void update_choked_peers(peer_t peer) i++; } xbt_dict_cursor_free(&cursor); - if (!peer_choosed->interested || !peer_choosed->choked_upload) { + if (peer_choosed == NULL) + THROWF(unknown_error, 0, "A peer should have be selected at this point"); + else if ((peer_choosed->interested == 0) || (peer_choosed->choked_upload == 0)) peer_choosed = NULL; - } + else + XBT_DEBUG("Nothing to do, keep going"); j++; } while (peer_choosed == NULL && j < MAXIMUM_PAIRS); } else { @@ -632,7 +632,8 @@ void update_choked_peers(peer_t peer) connection_t connection; double fastest_speed = 0.0; xbt_dict_foreach(peer->peers, cursor, key, connection) { - if (connection->peer_speed > fastest_speed && connection->choked_upload && connection->interested) { + if (connection->peer_speed > fastest_speed && + (connection->choked_upload != 0) && (connection->interested != 0)) { peer_choosed = connection; fastest_speed = connection->peer_speed; } @@ -648,7 +649,7 @@ void update_choked_peers(peer_t peer) if (peer_choked != NULL) { xbt_assert((!peer_choked->choked_upload), "Tries to choked a choked peer"); peer_choked->choked_upload = 1; - xbt_assert((*((int *) key_choked) == peer_choked->id), "WTF !!!"); + xbt_assert((*((int *) key_choked) == peer_choked->id)); update_active_peers_set(peer, peer_choked); XBT_DEBUG("(%d) Sending a CHOKE to %d", peer->id, peer_choked->id); send_choked(peer, peer_choked->mailbox); @@ -676,7 +677,7 @@ void update_interested_after_receive(peer_t peer) int interested; xbt_dict_foreach(peer->peers, cursor, key, connection) { interested = 0; - if (connection->am_interested) { + if (connection->am_interested != 0) { xbt_assert(connection->bitfield, "Bitfield not received"); //Check if the peer still has a piece we want. int i; @@ -732,8 +733,7 @@ int get_first_block(peer_t peer, int piece) int is_interested(peer_t peer, connection_t remote_peer) { xbt_assert(remote_peer->bitfield, "Bitfield not received"); - int i; - for (i = 0; i < FILE_PIECES; i++) { + for (int i = 0; i < FILE_PIECES; i++) { if (remote_peer->bitfield[i] == '1' && peer->bitfield[i] == '0') { return 1; } @@ -745,9 +745,9 @@ int is_interested(peer_t peer, connection_t remote_peer) int is_interested_and_free(peer_t peer, connection_t remote_peer) { xbt_assert(remote_peer->bitfield, "Bitfield not received"); - int i; - for (i = 0; i < FILE_PIECES; i++) { - if (remote_peer->bitfield[i] == '1' && peer->bitfield[i] == '0' && !in_current_pieces(peer, i)) { + for (int i = 0; i < FILE_PIECES; i++) { + if (remote_peer->bitfield[i] == '1' && peer->bitfield[i] == '0' && + (in_current_pieces(peer, i) == 0)) { return 1; } } @@ -758,9 +758,9 @@ int is_interested_and_free(peer_t peer, connection_t remote_peer) int partially_downloaded_piece(peer_t peer, connection_t remote_peer) { xbt_assert(remote_peer->bitfield, "Bitfield not received"); - int i; - for (i = 0; i < FILE_PIECES; i++) { - if (remote_peer->bitfield[i] == '1' && peer->bitfield[i] == '0' && !in_current_pieces(peer, i)) { + for (int i = 0; i < FILE_PIECES; i++) { + if (remote_peer->bitfield[i] == '1' && peer->bitfield[i] == '0' && + (in_current_pieces(peer, i) == 0)) { if (get_first_block(peer, i) > 0) return i; } @@ -775,12 +775,11 @@ int partially_downloaded_piece(peer_t peer, connection_t remote_peer) void send_request_to_peer(peer_t peer, connection_t remote_peer, int piece) { remote_peer->current_piece = piece; - int block_index, block_length; xbt_assert(remote_peer->bitfield, "bitfield not received"); - xbt_assert(remote_peer->bitfield[piece] == '1', "WTF !!!"); - block_index = get_first_block(peer, piece); + xbt_assert(remote_peer->bitfield[piece] == '1'); + int block_index = get_first_block(peer, piece); if (block_index != -1) { - block_length = PIECES_BLOCKS - block_index; + int block_length = PIECES_BLOCKS - block_index; block_length = MIN(BLOCKS_REQUESTED, block_length); send_request(peer, remote_peer->mailbox, piece, block_index, block_length); } @@ -789,14 +788,7 @@ void send_request_to_peer(peer_t peer, connection_t remote_peer, int piece) /** Indicates if a piece is currently being downloaded by the peer. */ int in_current_pieces(peer_t peer, int piece) { - unsigned i; - int peer_piece; - xbt_dynar_foreach(peer->current_pieces, i, peer_piece) { - if (peer_piece == piece) { - return 1; - } - } - return 0; + return xbt_dynar_member(peer->current_pieces, &piece); } /*********************************************************** @@ -805,8 +797,6 @@ int in_current_pieces(peer_t peer, int piece) * ***********************************************************/ - - /** @brief Send a "interested" message to a peer * @param peer peer data * @param mailbox destination mailbox