+ piece = partially_downloaded_piece(peer, remote_peer);
+ // strict priority policy
+ if (piece != -1)
+ return piece;
+
+ // end game mode
+ if (xbt_dynar_length(peer->current_pieces) >= (FILE_PIECES - peer->pieces)
+ && is_interested(peer, remote_peer)) {
+ if(!ENABLE_END_GAME_MODE)
+ return -1;
+ int i;
+ int nb_interesting_pieces = 0;
+ int random_piece_index, 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 !!!");
+ // get a random interesting piece
+ 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) {
+ piece = i;
+ break;
+ }
+ current_index++;
+ }
+ }
+ xbt_assert(piece != -1, "WTF !!!");
+ return piece;