- && remote_peer->bitfield[i] == '1' && !in_current_pieces(peer, i)) {
- min = peer->pieces_count[i];
- min_piece = i;
+ && remote_peer->bitfield[i] == '1' && !in_current_pieces(peer, i))
+ min = peer->pieces_count[i];
+ }
+ xbt_assert(min != SHRT_MAX || !is_interested_and_free(peer, remote_peer), "WTF !!!");
+ // 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))
+ nb_min_pieces++;
+ }
+ xbt_assert(nb_min_pieces != 0 || !is_interested_and_free(peer, remote_peer), "WTF !!!");
+ // get a random rarest piece
+ 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 (random_rarest_index == current_index) {
+ piece = i;
+ break;
+ }
+ current_index++;