Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
this was a bad idea and I messed up my commits
authorFrederic Suter <frederic.suter@cc.in2p3.fr>
Tue, 17 Oct 2017 14:10:00 +0000 (16:10 +0200)
committerFrederic Suter <frederic.suter@cc.in2p3.fr>
Tue, 17 Oct 2017 14:10:00 +0000 (16:10 +0200)
teshsuite/msg/app-bittorrent/connection.c
teshsuite/msg/app-bittorrent/connection.h
teshsuite/msg/app-bittorrent/messages.c
teshsuite/msg/app-bittorrent/messages.h
teshsuite/msg/app-bittorrent/peer.c
teshsuite/msg/app-bittorrent/peer.h
teshsuite/msg/app-bittorrent/tracker.c
teshsuite/msg/app-bittorrent/tracker.h

index 24a27d7..3a53ed9 100644 (file)
@@ -9,12 +9,12 @@
 #include <xbt/sysdep.h>
 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(msg_peers);
 
-connection_t connection_new(const char* id)
+connection_t connection_new(int id)
 {
   connection_t connection = xbt_new(s_connection_t, 1);
 
-  connection->id              = xbt_strdup(id);
-  connection->mailbox         = xbt_strdup(id);
+  connection->id              = id;
+  connection->mailbox         = bprintf("%d", id);
   connection->bitfield        = 0;
   connection->current_piece   = -1;
   connection->interested      = 0;
@@ -35,7 +35,6 @@ void connection_add_speed_value(connection_t connection, double speed)
 void connection_free(void* data)
 {
   connection_t co = (connection_t)data;
-  xbt_free(co->id);
   xbt_free(co->mailbox);
   xbt_free(co);
 }
index ccfc52a..2b64528 100644 (file)
@@ -9,7 +9,7 @@
 
 /**  Contains the connection data of a peer. */
 typedef struct s_connection {
-  char* id;              // Peer id
+  int id;                // Peer id
   unsigned int bitfield; // Fields
   char* mailbox;
   int messages_count;
@@ -27,7 +27,7 @@ typedef s_connection_t* connection_t;
 /** @brief Build a new connection object from the peer id.
  *  @param id id of the peer
  */
-connection_t connection_new(const char* id);
+connection_t connection_new(int id);
 /** @brief Add a new value to the peer speed average
  *  @param connection connection data
  *  @param speed speed to add to the speed average
index ea8d216..671c289 100644 (file)
@@ -18,7 +18,7 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(msg_messages, "Messages specific for the message fa
  * @param peer_id id of the issuer
  * @param size message size in bytes
  */
-msg_task_t task_message_new(e_message_type type, const char* issuer_host_name, const char* mailbox, const char* peer_id,
+msg_task_t task_message_new(e_message_type type, const char* issuer_host_name, const char* mailbox, int peer_id,
                             int size)
 {
   message_t message         = xbt_new(s_message_t, 1);
@@ -32,8 +32,8 @@ msg_task_t task_message_new(e_message_type type, const char* issuer_host_name, c
 }
 
 /** Builds a message containing an index. */
-msg_task_t task_message_index_new(e_message_type type, const char* issuer_host_name, const char* mailbox,
-                                  const char* peer_id, int index, int varsize)
+msg_task_t task_message_index_new(e_message_type type, const char* issuer_host_name, const char* mailbox, int peer_id,
+                                  int index, int varsize)
 {
   msg_task_t task   = task_message_new(type, issuer_host_name, mailbox, peer_id, task_message_size(type) + varsize);
   message_t message = MSG_task_get_data(task);
@@ -41,7 +41,7 @@ msg_task_t task_message_index_new(e_message_type type, const char* issuer_host_n
   return task;
 }
 
-msg_task_t task_message_bitfield_new(const char* issuer_host_name, const char* mailbox, const char* peer_id,
+msg_task_t task_message_bitfield_new(const char* issuer_host_name, const char* mailbox, int peer_id,
                                      unsigned int bitfield, int bitfield_size)
 {
   msg_task_t task = task_message_new(MESSAGE_BITFIELD, issuer_host_name, mailbox, peer_id,
@@ -51,7 +51,7 @@ msg_task_t task_message_bitfield_new(const char* issuer_host_name, const char* m
   return task;
 }
 
-msg_task_t task_message_request_new(const char* issuer_host_name, const char* mailbox, const char* peer_id, int index,
+msg_task_t task_message_request_new(const char* issuer_host_name, const char* mailbox, int peer_id, int index,
                                     int block_index, int block_length)
 {
   msg_task_t task       = task_message_index_new(MESSAGE_REQUEST, issuer_host_name, mailbox, peer_id, index, 0);
@@ -61,7 +61,7 @@ msg_task_t task_message_request_new(const char* issuer_host_name, const char* ma
   return task;
 }
 
-msg_task_t task_message_piece_new(const char* issuer_host_name, const char* mailbox, const char* peer_id, int index,
+msg_task_t task_message_piece_new(const char* issuer_host_name, const char* mailbox, int peer_id, int index,
                                   int block_index, int block_length, int block_size)
 {
   msg_task_t task =
index 7b9a723..a86649b 100644 (file)
@@ -42,7 +42,7 @@ typedef struct s_message {
   e_message_type type;
   const char* mailbox;
   const char* issuer_host_name;
-  const char* peer_id;
+  int peer_id;
   unsigned int bitfield;
   int index;
   int block_index;
@@ -51,19 +51,19 @@ typedef struct s_message {
 typedef s_message_t* message_t;
 
 /** Builds a new value-less message */
-msg_task_t task_message_new(e_message_type type, const char* issuer_host_name, const char* mailbox, const char* peer_id,
+msg_task_t task_message_new(e_message_type type, const char* issuer_host_name, const char* mailbox, int peer_id,
                             int size);
 /** Builds a new "have/piece" message */
-msg_task_t task_message_index_new(e_message_type type, const char* issuer_host_name, const char* mailbox,
-                                  const char* peer_id, int index, int varsize);
+msg_task_t task_message_index_new(e_message_type type, const char* issuer_host_name, const char* mailbox, int peer_id,
+                                  int index, int varsize);
 /** Builds a new bitfield message */
-msg_task_t task_message_bitfield_new(const char* issuer_host_name, const char* mailbox, const char* peer_id,
+msg_task_t task_message_bitfield_new(const char* issuer_host_name, const char* mailbox, int peer_id,
                                      unsigned int bitfield, int bitfield_size);
 /** Builds a new "request" message */
-msg_task_t task_message_request_new(const char* issuer_host_name, const char* mailbox, const char* peer_id, int index,
+msg_task_t task_message_request_new(const char* issuer_host_name, const char* mailbox, int peer_id, int index,
                                     int block_index, int block_length);
 /** Build a new "piece" message */
-msg_task_t task_message_piece_new(const char* issuer_host_name, const char* mailbox, const char* peer_id, int index,
+msg_task_t task_message_piece_new(const char* issuer_host_name, const char* mailbox, int peer_id, int index,
                                   int block_index, int block_length, int block_size);
 /** Free a message task */
 void task_message_free(void*);
index 1c865bf..69d75df 100644 (file)
@@ -64,7 +64,7 @@ int peer(int argc, char* argv[])
   xbt_assert(argc == 3 || argc == 4, "Wrong number of arguments");
 
   // Build peer object
-  peer_t peer = peer_init(argv[1], argc == 4 ? 1 : 0);
+  peer_t peer = peer_init(xbt_str_parse_int(argv[1], "Invalid ID: %s"), argc == 4 ? 1 : 0);
 
   // Retrieve deadline
   double deadline = xbt_str_parse_double(argv[2], "Invalid deadline: %s");
@@ -72,7 +72,7 @@ int peer(int argc, char* argv[])
 
   char* status = xbt_malloc0(FILE_PIECES + 1);
   get_status(&status, peer->bitfield);
-  XBT_INFO("Hi, I'm joining the network with id %d", atoi(peer->id));
+  XBT_INFO("Hi, I'm joining the network with id %d", peer->id);
   // Getting peer data from the tracker.
   if (get_peers_data(peer)) {
     XBT_DEBUG("Got %d peers from the tracker. Current status is: %s", xbt_dict_length(peer->peers), status);
@@ -135,7 +135,7 @@ void leech_loop(peer_t peer, double deadline)
     }
   }
   if (has_finished(peer->bitfield))
-    XBT_DEBUG("%s becomes a seeder", peer->id);
+    XBT_DEBUG("%d becomes a seeder", peer->id);
 }
 
 /** @brief Peer main loop when it is seeding
@@ -199,11 +199,11 @@ int get_peers_data(peer_t peer)
     if (status == MSG_OK) {
       tracker_task_data_t data = MSG_task_get_data(task_received);
       unsigned i;
-      const char* peer_id;
+      int peer_id;
       // Add the peers the tracker gave us to our peer list.
       xbt_dynar_foreach (data->peers, i, peer_id) {
-        if (!strcmp(peer_id, peer->id))
-          xbt_dict_set(peer->peers, peer_id, connection_new(peer_id), NULL);
+        if (peer_id != peer->id)
+          xbt_dict_set_ext(peer->peers, (char*)&peer_id, sizeof(int), connection_new(peer_id), NULL);
       }
       success = 1;
       // free the communication and the task
@@ -221,14 +221,14 @@ int get_peers_data(peer_t peer)
  *  @param id id of the peer to take in the network
  *  @param seed indicates if the peer is a seed.
  */
-peer_t peer_init(const char* id, int seed)
+peer_t peer_init(int id, int seed)
 {
   peer_t peer    = xbt_new(s_peer_t, 1);
-  peer->id       = xbt_strdup(id);
+  peer->id       = id;
   peer->hostname = MSG_host_get_name(MSG_host_self());
 
-  snprintf(peer->mailbox, MAILBOX_SIZE - 1, "%s", id);
-  snprintf(peer->mailbox_tracker, MAILBOX_SIZE - 1, "tracker_%s", id);
+  snprintf(peer->mailbox, MAILBOX_SIZE - 1, "%d", id);
+  snprintf(peer->mailbox_tracker, MAILBOX_SIZE - 1, "tracker_%d", id);
   peer->peers        = xbt_dict_new_homogeneous(NULL);
   peer->active_peers = xbt_dict_new_homogeneous(NULL);
 
@@ -264,7 +264,6 @@ void peer_free(peer_t peer)
   xbt_dict_free(&peer->peers);
   xbt_dict_free(&peer->active_peers);
   xbt_free(peer->pieces_count);
-  xbt_free(peer->id);
   xbt_free(peer);
 }
 
@@ -293,9 +292,9 @@ 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(peer->active_peers, remote_peer->id, remote_peer, NULL);
-  } else if (xbt_dict_get_or_null(peer->active_peers, remote_peer->id)) {
-    xbt_dict_remove(peer->active_peers, remote_peer->id);
+    xbt_dict_set_ext(peer->active_peers, (char*)&remote_peer->id, sizeof(int), remote_peer, NULL);
+  } 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));
   }
 }
 
@@ -312,13 +311,13 @@ void handle_message(peer_t peer, msg_task_t task)
             message->issuer_host_name);
 
   connection_t remote_peer;
-  remote_peer = xbt_dict_get_or_null(peer->peers, message->peer_id);
+  remote_peer = xbt_dict_get_or_null_ext(peer->peers, (char*)&message->peer_id, sizeof(int));
 
   switch (message->type) {
     case MESSAGE_HANDSHAKE:
       // Check if the peer is in our connection list.
       if (remote_peer == 0) {
-        xbt_dict_set(peer->peers, message->peer_id, connection_new(message->peer_id), NULL);
+        xbt_dict_set_ext(peer->peers, (char*)&message->peer_id, sizeof(int), connection_new(message->peer_id), NULL);
         send_handshake(peer, message->mailbox);
       }
       // Send our bitfield to the peer
@@ -384,7 +383,7 @@ void handle_message(peer_t peer, msg_task_t task)
           send_piece(peer, message->mailbox, message->index, message->block_index, message->block_length);
         }
       } else {
-        XBT_DEBUG("\t for piece %s but he is choked.", message->peer_id);
+        XBT_DEBUG("\t for piece %d but he is choked.", message->peer_id);
       }
       break;
     case MESSAGE_PIECE:
@@ -580,7 +579,7 @@ void update_choked_peers(peer_t peer)
 {
   if (nb_interested_peers(peer) == 0)
     return;
-  XBT_DEBUG("(%s) update_choked peers %u active peers", peer->id, xbt_dict_size(peer->active_peers));
+  XBT_DEBUG("(%d) update_choked peers %u active peers", peer->id, xbt_dict_size(peer->active_peers));
   // update the current round
   peer->round = (peer->round + 1) % 3;
   char* key;
@@ -648,24 +647,24 @@ void update_choked_peers(peer_t peer)
   }
 
   if (peer_choosed != NULL)
-    XBT_DEBUG("(%s) update_choked peers unchoked (%s) ; int (%d) ; choked (%d) ", peer->id, peer_choosed->id,
+    XBT_DEBUG("(%d) update_choked peers unchoked (%d) ; int (%d) ; choked (%d) ", peer->id, peer_choosed->id,
               peer_choosed->interested, peer_choosed->choked_upload);
 
   if (peer_choked != peer_choosed) {
     if (peer_choked != NULL) {
       xbt_assert((!peer_choked->choked_upload), "Tries to choked a choked peer");
       peer_choked->choked_upload = 1;
-      xbt_assert(strcmp(key_choked, peer_choked->id));
+      xbt_assert((*((int*)key_choked) == peer_choked->id));
       update_active_peers_set(peer, peer_choked);
-      XBT_DEBUG("(%s) Sending a CHOKE to %s", peer->id, peer_choked->id);
+      XBT_DEBUG("(%d) Sending a CHOKE to %d", peer->id, peer_choked->id);
       send_choked(peer, peer_choked->mailbox);
     }
     if (peer_choosed != NULL) {
       xbt_assert((peer_choosed->choked_upload), "Tries to unchoked an unchoked peer");
       peer_choosed->choked_upload = 0;
-      xbt_dict_set(peer->active_peers, peer_choosed->id, peer_choosed, NULL);
+      xbt_dict_set_ext(peer->active_peers, (char*)&peer_choosed->id, sizeof(int), peer_choosed, NULL);
       peer_choosed->last_unchoke = MSG_get_clock();
-      XBT_DEBUG("(%s) Sending a UNCHOKE to %s", peer->id, peer_choosed->id);
+      XBT_DEBUG("(%d) Sending a UNCHOKE to %d", peer->id, peer_choosed->id);
       update_active_peers_set(peer, peer_choosed);
       send_unchoked(peer, peer_choosed->mailbox);
     }
index 22df913..a3ac6bf 100644 (file)
@@ -15,7 +15,7 @@
 
 /** Peer data */
 typedef struct s_peer {
-  char* id; // peer id
+  int id; // peer id
 
   unsigned int bitfield;              // list of pieces the peer has.
   unsigned long long bitfield_blocks; // list of blocks the peer has.
@@ -48,7 +48,7 @@ int get_peers_data(peer_t peer);
 void leech_loop(peer_t peer, double deadline);
 void seed_loop(peer_t peer, double deadline);
 
-peer_t peer_init(const char* id, int seed);
+peer_t peer_init(int id, int seed);
 void peer_free(peer_t peer);
 
 char* print_bitfield(unsigned int bitfield);
index c89cff3..d4025c7 100644 (file)
@@ -26,7 +26,7 @@ int tracker(int argc, char* argv[])
 
   RngStream stream = (RngStream)MSG_host_get_data(MSG_host_self());
   // Building peers array
-  xbt_dynar_t peers_list = xbt_dynar_new(sizeof(const char*), NULL);
+  xbt_dynar_t peers_list = xbt_dynar_new(sizeof(int), NULL);
 
   XBT_INFO("Tracker launched.");
 
@@ -44,16 +44,16 @@ int tracker(int argc, char* argv[])
         tracker_task_data_t data = MSG_task_get_data(task_received);
         // Add the peer to our peer list.
         if (is_in_list(peers_list, data->peer_id) == 0) {
-          xbt_dynar_push(peers_list, &data->peer_id);
+          xbt_dynar_push_as(peers_list, int, data->peer_id);
         }
         // Sending peers to the peer
-        const char* next_peer;
+        int next_peer;
         int peers_length = xbt_dynar_length(peers_list);
         for (int i = 0; i < MAXIMUM_PEERS && i < peers_length; i++) {
           do {
-            xbt_dynar_get_cpy(peers_list, RngStream_RandInt(stream, 0, peers_length - 1), &next_peer);
+            next_peer = xbt_dynar_get_as(peers_list, RngStream_RandInt(stream, 0, peers_length - 1), int);
           } while (is_in_list(data->peers, next_peer));
-          xbt_dynar_push(data->peers, &next_peer);
+          xbt_dynar_push_as(data->peers, int, next_peer);
         }
         // setting the interval
         data->interval = TRACKER_QUERY_INTERVAL;
@@ -84,8 +84,8 @@ int tracker(int argc, char* argv[])
  * Build a new task for the tracker.
  * @param issuer_host_name Hostname of the issuer. For debugging purposes
  */
-tracker_task_data_t tracker_task_data_new(const char* issuer_host_name, const char* mailbox, const char* peer_id,
-                                          int uploaded, int downloaded, int left)
+tracker_task_data_t tracker_task_data_new(const char* issuer_host_name, const char* mailbox, int peer_id, int uploaded,
+                                          int downloaded, int left)
 {
   tracker_task_data_t task = xbt_new(s_tracker_task_data_t, 1);
 
@@ -97,7 +97,7 @@ tracker_task_data_t tracker_task_data_new(const char* issuer_host_name, const ch
   task->downloaded       = downloaded;
   task->left             = left;
 
-  task->peers = xbt_dynar_new(sizeof(const char*), NULL);
+  task->peers = xbt_dynar_new(sizeof(int), NULL);
 
   return task;
 }
@@ -119,7 +119,7 @@ static void task_free(void* data)
  */
 void tracker_task_data_free(tracker_task_data_t task)
 {
-  xbt_dynar_free_container(&task->peers);
+  xbt_dynar_free(&task->peers);
   xbt_free(task);
 }
 
@@ -128,7 +128,7 @@ void tracker_task_data_free(tracker_task_data_t task)
  * @param peers dynar containing the peers
  * @param id identifier of the peer to test
  */
-int is_in_list(xbt_dynar_t peers, const char* id)
+int is_in_list(xbt_dynar_t peers, int id)
 {
   return xbt_dynar_member(peers, &id);
 }
index 898a506..f00e71f 100644 (file)
@@ -24,7 +24,7 @@ typedef struct s_tracker_task_data {
   const char* mailbox;          // mailbox where the tracker should answer
   const char* issuer_host_name; // hostname, for debug purposes
   // Query data
-  const char* peer_id; // peer id
+  int peer_id;    // peer id
   int uploaded;   // how much the peer has already uploaded
   int downloaded; // how much the peer has downloaded
   int left;       // how much the peer has left
@@ -34,9 +34,9 @@ typedef struct s_tracker_task_data {
 } s_tracker_task_data_t;
 typedef s_tracker_task_data_t* tracker_task_data_t;
 
-tracker_task_data_t tracker_task_data_new(const char* issuer_host_name, const char* mailbox, const char* peer_id,
-                                          int uploaded, int downloaded, int left);
+tracker_task_data_t tracker_task_data_new(const char* issuer_host_name, const char* mailbox, int peer_id, int uploaded,
+                                          int downloaded, int left);
 void tracker_task_data_free(tracker_task_data_t task);
 
-int is_in_list(xbt_dynar_t peers, const char* id);
+int is_in_list(xbt_dynar_t peers, int id);
 #endif /* BITTORRENT_TRACKER_H */