From fcf20c7c0cc6950013e81df87afa2162f53e29cb Mon Sep 17 00:00:00 2001 From: Arvid Norberg Date: Mon, 11 Dec 2006 15:43:27 +0000 Subject: [PATCH] invariant check fixes --- src/peer_connection.cpp | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/src/peer_connection.cpp b/src/peer_connection.cpp index d70d99b38..a02de9ee1 100755 --- a/src/peer_connection.cpp +++ b/src/peer_connection.cpp @@ -987,6 +987,7 @@ namespace libtorrent piece_picker& picker = t->picker(); piece_manager& fs = t->filesystem(); + std::vector finished_blocks; piece_block block_finished(p.piece, p.start / t->block_size()); bool redundant = true; for (;block_finished.block_index * t->block_size() < p.start + p.length; @@ -1071,9 +1072,7 @@ namespace libtorrent redundant = false; } - picker.mark_as_finished(block_finished, m_remote); - - t->get_policy().block_finished(*this, block_finished); + finished_blocks.push_back(block_finished); } if (redundant) return; @@ -1084,6 +1083,13 @@ namespace libtorrent bool was_finished = picker.num_filtered() + t->num_pieces() == t->torrent_file().num_pieces(); + for (std::vector::iterator i = finished_blocks.begin() + , end(finished_blocks.end()); i != end; ++i) + { + picker.mark_as_finished(*i, m_remote); + t->get_policy().block_finished(*this, *i); + } + // did we just finish the piece? if (picker.is_piece_finished(p.piece)) { @@ -1120,6 +1126,17 @@ namespace libtorrent t->completed(); } } +#ifndef NDEBUG + + size_type total_done, total_wanted; + boost::tie(total_done, total_wanted) = t->bytes_done(); + if (t->is_seed()) + assert(total_done == t->torrent_file().total_size()); + else + assert(total_done != t->torrent_file().total_size()); + + t->check_invariant(); +#endif } // ----------------------------- @@ -1456,14 +1473,13 @@ namespace libtorrent m_request_queue.pop_back(); } } -#ifndef NDEBUG - else - { - assert(m_download_queue.empty()); - assert(m_request_queue.empty()); - } -#endif + t->remove_peer(this); + +#ifndef NDEBUG + assert(m_download_queue.empty()); + assert(m_request_queue.empty()); +#endif m_torrent.reset(); }