Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Harden msg/app-bittorrent for parallel executions.
authorArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Wed, 5 Feb 2020 13:02:30 +0000 (14:02 +0100)
committerArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Mon, 27 Nov 2023 08:45:06 +0000 (09:45 +0100)
Reintroduce several streams of random numbers, which were lost when RngStream
was removed.

FIXME: rand_r may not be available on all platforms (e.g. win32)
       we need a C interface for xbt::random

examples/c/app-bittorrent/app-bittorrent.c
examples/c/app-bittorrent/bittorrent-peer.c
examples/c/app-bittorrent/bittorrent-peer.h
examples/c/app-bittorrent/tracker.c

index fafe793..da50940 100644 (file)
@@ -20,6 +20,16 @@ int main(int argc, char* argv[])
 
   simgrid_load_platform(argv[1]);
 
+  sg_host_t* host_list = sg_host_list();
+  size_t host_count    = sg_host_count();
+  unsigned* seed       = xbt_new(unsigned, host_count);
+  for (size_t i = 0; i < host_count; i++) {
+    seed[i] = i;
+    rand_r(&seed[i]);
+    sg_host_set_data(host_list[i], &seed[i]);
+  }
+  xbt_free(host_list);
+
   simgrid_register_function("tracker", tracker_run);
   simgrid_register_function("peer", peer_run);
 
@@ -27,5 +37,6 @@ int main(int argc, char* argv[])
 
   simgrid_run();
 
+  xbt_free(seed);
   return 0;
 }
index 55e2ed2..e66b37c 100644 (file)
@@ -38,6 +38,7 @@ static peer_t peer_init(int id, int seed)
 {
   peer_t peer = xbt_new(s_peer_t, 1);
   peer->id    = id;
+  peer->seedp = sg_host_get_data(sg_host_self());
 
   char mailbox_name[MAILBOX_SIZE];
   snprintf(mailbox_name, MAILBOX_SIZE - 1, "%d", id);
@@ -536,7 +537,7 @@ int select_piece_to_download(const_peer_t peer, const_connection_t remote_peer)
     }
     xbt_assert(nb_interesting_pieces != 0);
     // get a random interesting piece
-    int random_piece_index = rand() % nb_interesting_pieces;
+    int random_piece_index = rand_r(peer->seedp) % nb_interesting_pieces;
     int current_index      = 0;
     for (unsigned int i = 0; i < FILE_PIECES; i++) {
       if (peer_has_not_piece(peer, i) && connection_has_piece(remote_peer, i)) {
@@ -562,7 +563,7 @@ int select_piece_to_download(const_peer_t peer, const_connection_t remote_peer)
     }
     xbt_assert(nb_interesting_pieces != 0);
     // get a random interesting piece
-    int random_piece_index = rand() % nb_interesting_pieces;
+    int random_piece_index = rand_r(peer->seedp) % nb_interesting_pieces;
     int current_index      = 0;
     for (unsigned int i = 0; i < FILE_PIECES; i++) {
       if (peer_has_not_piece(peer, i) && connection_has_piece(remote_peer, i) &&
@@ -597,7 +598,7 @@ int select_piece_to_download(const_peer_t peer, const_connection_t remote_peer)
     // get a random rarest piece
     int random_rarest_index = 0;
     if (nb_min_pieces > 0) {
-      random_rarest_index = rand() % nb_min_pieces;
+      random_rarest_index = rand_r(peer->seedp) % nb_min_pieces;
     }
     for (unsigned int i = 0; i < FILE_PIECES; i++) {
       if (peer->pieces_count[i] == min && peer_has_not_piece(peer, i) && connection_has_piece(remote_peer, i) &&
@@ -655,7 +656,7 @@ void update_choked_peers(peer_t peer)
         // We choose a random peer to unchoke.
         int id_chosen = 0;
         if (xbt_dict_length(peer->connected_peers) > 0) {
-          id_chosen = rand() % xbt_dict_length(peer->connected_peers);
+          id_chosen = rand_r(peer->seedp) % xbt_dict_length(peer->connected_peers);
         }
         int i = 0;
         connection_t connection;
index 7757e66..f37fd6b 100644 (file)
@@ -37,6 +37,7 @@ int connection_has_piece(const_connection_t connection, unsigned int piece);
 /** Peer data */
 typedef struct s_peer {
   int id; // peer id
+  unsigned* seedp; // current state for rand_r()
   double deadline;
   sg_mailbox_t mailbox; // peer mailbox.
 
index abed9ce..d28c2b7 100644 (file)
@@ -33,6 +33,7 @@ void tracker_run(int argc, char* argv[])
   double deadline = xbt_str_parse_double(argv[1], "Invalid deadline");
   xbt_assert(deadline > 0, "Wrong deadline supplied");
 
+  unsigned* seedp = sg_host_get_data(sg_host_self());
   // Building peers array
   xbt_dynar_t peers_list = xbt_dynar_new(sizeof(int), NULL);
 
@@ -61,7 +62,7 @@ void tracker_run(int argc, char* argv[])
       int peers_length = (int)xbt_dynar_length(peers_list);
       for (int i = 0; i < MAXIMUM_PEERS && i < peers_length; i++) {
         do {
-          next_peer = xbt_dynar_get_as(peers_list, rand() % peers_length, int);
+          next_peer = xbt_dynar_get_as(peers_list, rand_r(seedp) % peers_length, int);
         } while (is_in_list(ta->peers, next_peer));
         xbt_dynar_push_as(ta->peers, int, next_peer);
       }