diff --git a/libtorrent/include/libtorrent/torrent.hpp b/libtorrent/include/libtorrent/torrent.hpp index 0f508e93f..4731da6b2 100755 --- a/libtorrent/include/libtorrent/torrent.hpp +++ b/libtorrent/include/libtorrent/torrent.hpp @@ -779,6 +779,10 @@ namespace libtorrent // the maximum number of connections for this torrent int m_max_connections; + +#ifndef NDEBUG + bool m_files_checked; +#endif #ifndef TORRENT_DISABLE_EXTENSIONS typedef std::list > extension_list_t; diff --git a/libtorrent/src/piece_picker.cpp b/libtorrent/src/piece_picker.cpp index 831bd0986..dbdba17f0 100755 --- a/libtorrent/src/piece_picker.cpp +++ b/libtorrent/src/piece_picker.cpp @@ -80,10 +80,10 @@ namespace libtorrent TORRENT_ASSERT(m_blocks_in_last_piece <= m_blocks_per_piece); // allocate the piece_map to cover all pieces - // and make them invalid (as if though we already had every piece) + // and make them invalid (as if we don't have a single piece) std::fill(m_piece_map.begin(), m_piece_map.end() - , piece_pos(0, piece_pos::we_have_index)); - m_num_have = m_piece_map.size(); + , piece_pos(0, 0)); + m_num_have = 0; } // pieces is a bitmask with the pieces we have @@ -92,20 +92,29 @@ namespace libtorrent , std::vector const& unfinished , std::vector& verify_pieces) { + TORRENT_PIECE_PICKER_INVARIANT_CHECK; #ifndef NDEBUG m_files_checked_called = true; #endif for (std::vector::const_iterator i = pieces.begin(); i != pieces.end(); ++i) { - if (*i) continue; int index = static_cast(i - pieces.begin()); - m_piece_map[index].index = 0; - --m_num_have; - if (m_piece_map[index].filtered()) + piece_pos& p = m_piece_map[index]; + if (*i) { - ++m_num_filtered; - --m_num_have_filtered; + ++m_num_have; + p.set_have(); + if (p.filtered()) + { + ++m_num_have_filtered; + TORRENT_ASSERT(m_num_filtered > 0); + --m_num_filtered; + } + } + else + { + p.index = 0; } } @@ -283,6 +292,9 @@ namespace libtorrent void piece_picker::check_invariant(const torrent* t) const { TORRENT_ASSERT(sizeof(piece_pos) == 4); + TORRENT_ASSERT(m_num_have >= 0); + TORRENT_ASSERT(m_num_have_filtered >= 0); + TORRENT_ASSERT(m_num_filtered >= 0); TORRENT_ASSERT(m_piece_info.empty() || m_piece_info[0].empty()); diff --git a/libtorrent/src/torrent.cpp b/libtorrent/src/torrent.cpp index 557289d60..e8c1f2247 100755 --- a/libtorrent/src/torrent.cpp +++ b/libtorrent/src/torrent.cpp @@ -204,6 +204,9 @@ namespace libtorrent , m_max_connections((std::numeric_limits::max)()) , m_policy(this) { +#ifndef NDEBUG + m_files_checked = false; +#endif } torrent::torrent( @@ -263,6 +266,9 @@ namespace libtorrent , m_max_connections((std::numeric_limits::max)()) , m_policy(this) { +#ifndef NDEBUG + m_files_checked = false; +#endif INVARIANT_CHECK; if (name) m_name.reset(new std::string(name)); @@ -2521,6 +2527,9 @@ namespace libtorrent } } } +#ifndef NDEBUG + m_files_checked = true; +#endif } alert_manager& torrent::alerts() const @@ -2658,7 +2667,7 @@ namespace libtorrent complete = false; break; } - if (complete) + if (complete && m_files_checked) { disk_io_job ret = m_ses.m_disk_thread.find_job( m_owning_storage, -1, i->index);