Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
few fixes and improvements in bittorrent
[simgrid.git] / examples / msg / app-bittorrent / peer.c
index fdcc051..4aaf7c0 100644 (file)
@@ -156,7 +156,8 @@ void seed_loop(peer_t peer, double deadline)
  */
 int get_peers_data(peer_t peer)
 {
  */
 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,
   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,
@@ -276,15 +277,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);
   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));
   }
 }
 
   }
 }
 
@@ -361,7 +355,7 @@ 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);
          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;
         request_new_piece_to_peer(peer, remote_peer);
     }
     break;
@@ -369,7 +363,7 @@ void handle_message(peer_t peer, msg_task_t task)
     xbt_assert(remote_peer->interested, "WTF !!!");
 
     xbt_assert((message->index >= 0 && message->index < FILE_PIECES), "Wrong request received");
     xbt_assert(remote_peer->interested, "WTF !!!");
 
     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') {
       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') {
@@ -415,6 +409,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;
   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) {
   }
   //Update the peer speed.
   if (remote_peer) {
@@ -438,14 +434,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)
 {
 /** 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;
   if (piece_index != -1)
     xbt_dynar_remove_at(peer->current_pieces, piece_index, NULL);
   remote_peer->current_piece = -1;
@@ -742,8 +731,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 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;
     }
     if (remote_peer->bitfield[i] == '1' && peer->bitfield[i] == '0') {
       return 1;
     }
@@ -755,8 +743,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 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;
     if (remote_peer->bitfield[i] == '1' && peer->bitfield[i] == '0' &&
         (in_current_pieces(peer, i) == 0)) {
       return 1;
@@ -769,8 +756,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 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)
     if (remote_peer->bitfield[i] == '1' && peer->bitfield[i] == '0' &&
         (in_current_pieces(peer, i) == 0)) {
       if (get_first_block(peer, i) > 0)
@@ -801,14 +787,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)
 {
 /** 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);
 }
 
 /***********************************************************
 }
 
 /***********************************************************