From 01c6300d51c38ca93f0377addd2313b09f148564 Mon Sep 17 00:00:00 2001 From: Arvid Norberg Date: Mon, 18 Feb 2008 20:55:03 +0000 Subject: [PATCH] another piece picker fix (fixes some logic mistakes from last piece picker update) --- src/piece_picker.cpp | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/src/piece_picker.cpp b/src/piece_picker.cpp index bce355b34..736f78937 100755 --- a/src/piece_picker.cpp +++ b/src/piece_picker.cpp @@ -1947,6 +1947,8 @@ namespace libtorrent return i->info[block.block_index].peer; } + // this is called when a request is rejected or when + // a peer disconnects. The piece might be in any state void piece_picker::abort_download(piece_block block) { TORRENT_PIECE_PICKER_INVARIANT_CHECK; @@ -1969,26 +1971,15 @@ namespace libtorrent block_info& info = i->info[block.block_index]; - TORRENT_ASSERT(info.state == block_info::state_requested); - TORRENT_ASSERT(info.num_peers > 0); + if (i->info[block.block_index].state != block_info::state_requested) + return; + + if (info.num_peers > 0) --info.num_peers; - --info.num_peers; TORRENT_ASSERT(block.block_index < blocks_in_piece(block.piece_index)); - // if there are other peers - if (info.num_peers > 0) - { - if (i->info[block.block_index].state == block_info::state_writing) - { - ++i->requested; - --i->writing; - i->info[block.block_index].state = block_info::state_requested; - // since we just cleared the writing state, we know that - // the peer for this block was the one we canceled - info.peer = 0; - } - return; - } + // if there are other peers, leave the block requested + if (info.num_peers > 0) return; // clear the downloader of this block info.peer = 0;