piece picker fix (#228)

This commit is contained in:
Arvid Norberg 2007-12-16 01:35:42 +00:00
parent eec07349e9
commit 68a388da19
2 changed files with 27 additions and 9 deletions

View File

@ -80,10 +80,10 @@ namespace libtorrent
TORRENT_ASSERT(m_blocks_in_last_piece <= m_blocks_per_piece); TORRENT_ASSERT(m_blocks_in_last_piece <= m_blocks_per_piece);
// allocate the piece_map to cover all pieces // 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() std::fill(m_piece_map.begin(), m_piece_map.end()
, piece_pos(0, piece_pos::we_have_index)); , piece_pos(0, 0));
m_num_have = m_piece_map.size(); m_num_have = 0;
} }
// pieces is a bitmask with the pieces we have // pieces is a bitmask with the pieces we have
@ -92,20 +92,29 @@ namespace libtorrent
, std::vector<downloading_piece> const& unfinished , std::vector<downloading_piece> const& unfinished
, std::vector<int>& verify_pieces) , std::vector<int>& verify_pieces)
{ {
TORRENT_PIECE_PICKER_INVARIANT_CHECK;
#ifndef NDEBUG #ifndef NDEBUG
m_files_checked_called = true; m_files_checked_called = true;
#endif #endif
for (std::vector<bool>::const_iterator i = pieces.begin(); for (std::vector<bool>::const_iterator i = pieces.begin();
i != pieces.end(); ++i) i != pieces.end(); ++i)
{ {
if (*i) continue;
int index = static_cast<int>(i - pieces.begin()); int index = static_cast<int>(i - pieces.begin());
m_piece_map[index].index = 0; piece_pos& p = m_piece_map[index];
--m_num_have; if (*i)
if (m_piece_map[index].filtered())
{ {
++m_num_filtered; ++m_num_have;
--m_num_have_filtered; 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 void piece_picker::check_invariant(const torrent* t) const
{ {
TORRENT_ASSERT(sizeof(piece_pos) == 4); 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()); TORRENT_ASSERT(m_piece_info.empty() || m_piece_info[0].empty());

View File

@ -123,12 +123,18 @@ boost::shared_ptr<piece_picker> setup_picker(
TEST_CHECK(avail == availability_vec[i]); TEST_CHECK(avail == availability_vec[i]);
} }
#ifndef NDEBUG
p->check_invariant();
#endif
return p; return p;
} }
bool verify_pick(boost::shared_ptr<piece_picker> p bool verify_pick(boost::shared_ptr<piece_picker> p
, std::vector<piece_block> const& picked) , std::vector<piece_block> const& picked)
{ {
#ifndef NDEBUG
p->check_invariant();
#endif
for (std::vector<piece_block>::const_iterator i = picked.begin() for (std::vector<piece_block>::const_iterator i = picked.begin()
, end(picked.end()); i != end; ++i) , end(picked.end()); i != end; ++i)
{ {