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);
// 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<downloading_piece> const& unfinished
, std::vector<int>& verify_pieces)
{
TORRENT_PIECE_PICKER_INVARIANT_CHECK;
#ifndef NDEBUG
m_files_checked_called = true;
#endif
for (std::vector<bool>::const_iterator i = pieces.begin();
i != pieces.end(); ++i)
{
if (*i) continue;
int index = static_cast<int>(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());

View File

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