Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Don't store raw objects as host properties, which must be strings
[simgrid.git] / examples / msg / app-bittorrent / peer.c
index fdcc051..e27520e 100644 (file)
@@ -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,
@@ -227,7 +227,7 @@ void peer_init(peer_t peer, int id, int seed)
 
   peer->current_pieces = xbt_dynar_new(sizeof(int), NULL);
 
-  peer->stream = (RngStream)MSG_host_get_property_value(MSG_host_self(), "stream");
+  peer->stream        = (RngStream)MSG_host_get_data(MSG_host_self());
   peer->comm_received = NULL;
 
   peer->round = 0;
@@ -276,15 +276,8 @@ void update_active_peers_set(peer_t peer, connection_t remote_peer)
   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));
   }
 }
 
@@ -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;
@@ -361,15 +354,15 @@ void handle_message(peer_t peer, msg_task_t task)
          peer->bitfield[message->index] == '0') {
       remote_peer->am_interested = 1;
       send_interested(peer, message->mailbox);
-      if ((remote_peer->choked_download == 0))
+      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 == 0)) {
+    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') {
@@ -383,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);
@@ -415,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) {
@@ -438,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, &current_piece);
   if (piece_index != -1)
     xbt_dynar_remove_at(peer->current_pieces, piece_index, NULL);
   remote_peer->current_piece = -1;
@@ -487,20 +475,21 @@ int select_piece_to_download(peer_t peer, connection_t remote_peer)
   // 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)
+#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) {
@@ -510,14 +499,14 @@ 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) != 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' &&
@@ -525,9 +514,9 @@ int select_piece_to_download(peer_t peer, connection_t remote_peer)
         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) == 0)) {
@@ -538,13 +527,13 @@ 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' &&
@@ -552,7 +541,7 @@ int select_piece_to_download(peer_t peer, connection_t remote_peer)
         min = peer->pieces_count[i];
     }
     xbt_assert(min != SHRT_MAX ||
-               (is_interested_and_free(peer, remote_peer) ==0), "WTF !!!");
+               (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' &&
@@ -560,9 +549,9 @@ int select_piece_to_download(peer_t peer, connection_t remote_peer)
         nb_min_pieces++;
     }
     xbt_assert(nb_min_pieces != 0 ||
-               (is_interested_and_free(peer, remote_peer)==0), "WTF !!!");
+               (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)==0)) {
@@ -573,8 +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) == 0), "WTF !!!");
+    xbt_assert(piece != -1 || (is_interested_and_free(peer, remote_peer) == 0));
     return piece;
   }
 }
@@ -589,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
@@ -630,10 +619,12 @@ void update_choked_peers(peer_t peer)
           i++;
         }
         xbt_dict_cursor_free(&cursor);
-        if ((peer_choosed->interested == 0) ||
-            (peer_choosed->choked_upload == 0)) {
+        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 {
@@ -658,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);
@@ -742,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;
     }
@@ -755,8 +745,7 @@ 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++) {
+  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;
@@ -769,8 +758,7 @@ 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++) {
+  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)
@@ -787,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);
   }
@@ -801,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);
 }
 
 /***********************************************************