forked from premiere/premiere-libtorrent
more asserts in piece_picker to validate peer pointers
This commit is contained in:
parent
48b85ba586
commit
de07505464
|
@ -47,6 +47,7 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#ifdef TORRENT_DEBUG
|
#ifdef TORRENT_DEBUG
|
||||||
#include "libtorrent/peer_connection.hpp"
|
#include "libtorrent/peer_connection.hpp"
|
||||||
#include "libtorrent/torrent.hpp"
|
#include "libtorrent/torrent.hpp"
|
||||||
|
#include "libtorrent/policy.hpp" // for policy::peer
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "libtorrent/invariant_check.hpp"
|
#include "libtorrent/invariant_check.hpp"
|
||||||
|
@ -308,6 +309,7 @@ namespace libtorrent
|
||||||
for (int k = 0; k < num_blocks; ++k)
|
for (int k = 0; k < num_blocks; ++k)
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(i->info[k].piece_index == i->index);
|
TORRENT_ASSERT(i->info[k].piece_index == i->index);
|
||||||
|
TORRENT_ASSERT(i->info[k].peer == 0 || static_cast<policy::peer*>(i->info[k].peer)->in_use);
|
||||||
if (i->info[k].state == block_info::state_finished)
|
if (i->info[k].state == block_info::state_finished)
|
||||||
{
|
{
|
||||||
++num_finished;
|
++num_finished;
|
||||||
|
@ -1372,6 +1374,8 @@ namespace libtorrent
|
||||||
, int options, std::vector<int> const& suggested_pieces
|
, int options, std::vector<int> const& suggested_pieces
|
||||||
, int num_peers) const
|
, int num_peers) const
|
||||||
{
|
{
|
||||||
|
TORRENT_ASSERT(peer == 0 || static_cast<policy::peer*>(peer)->in_use);
|
||||||
|
|
||||||
// prevent the number of partial pieces to grow indefinitely
|
// prevent the number of partial pieces to grow indefinitely
|
||||||
// make this scale by the number of peers we have. For large
|
// make this scale by the number of peers we have. For large
|
||||||
// scale clients, we would have more peers, and allow a higher
|
// scale clients, we would have more peers, and allow a higher
|
||||||
|
@ -1618,6 +1622,7 @@ namespace libtorrent
|
||||||
for (int j = 0; j < num_blocks_in_piece; ++j)
|
for (int j = 0; j < num_blocks_in_piece; ++j)
|
||||||
{
|
{
|
||||||
block_info const& info = i->info[j];
|
block_info const& info = i->info[j];
|
||||||
|
TORRENT_ASSERT(info.peer == 0 || static_cast<policy::peer*>(info.peer)->in_use);
|
||||||
TORRENT_ASSERT(info.piece_index == i->index);
|
TORRENT_ASSERT(info.piece_index == i->index);
|
||||||
if (info.state != block_info::state_requested
|
if (info.state != block_info::state_requested
|
||||||
|| info.peer == peer)
|
|| info.peer == peer)
|
||||||
|
@ -1744,7 +1749,10 @@ namespace libtorrent
|
||||||
{
|
{
|
||||||
for (std::vector<block_info>::iterator i = m_block_info.begin()
|
for (std::vector<block_info>::iterator i = m_block_info.begin()
|
||||||
, end(m_block_info.end()); i != end; ++i)
|
, end(m_block_info.end()); i != end; ++i)
|
||||||
|
{
|
||||||
|
TORRENT_ASSERT(i->peer == 0 || static_cast<policy::peer*>(i->peer)->in_use);
|
||||||
if (i->peer == peer) i->peer = 0;
|
if (i->peer == peer) i->peer = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
|
@ -1761,6 +1769,7 @@ namespace libtorrent
|
||||||
for (int j = 0; j < num_blocks_in_piece; ++j)
|
for (int j = 0; j < num_blocks_in_piece; ++j)
|
||||||
{
|
{
|
||||||
piece_picker::block_info const& info = p.info[j];
|
piece_picker::block_info const& info = p.info[j];
|
||||||
|
TORRENT_ASSERT(info.peer == 0 || static_cast<policy::peer*>(info.peer)->in_use);
|
||||||
TORRENT_ASSERT(info.piece_index == p.index);
|
TORRENT_ASSERT(info.piece_index == p.index);
|
||||||
if (info.state != piece_picker::block_info::state_none
|
if (info.state != piece_picker::block_info::state_none
|
||||||
&& info.peer != peer)
|
&& info.peer != peer)
|
||||||
|
@ -2081,6 +2090,7 @@ namespace libtorrent
|
||||||
bool piece_picker::mark_as_downloading(piece_block block
|
bool piece_picker::mark_as_downloading(piece_block block
|
||||||
, void* peer, piece_state_t state)
|
, void* peer, piece_state_t state)
|
||||||
{
|
{
|
||||||
|
TORRENT_ASSERT(peer == 0 || static_cast<policy::peer*>(peer)->in_use);
|
||||||
TORRENT_ASSERT(state != piece_picker::none);
|
TORRENT_ASSERT(state != piece_picker::none);
|
||||||
TORRENT_ASSERT(block.piece_index >= 0);
|
TORRENT_ASSERT(block.piece_index >= 0);
|
||||||
TORRENT_ASSERT(block.block_index >= 0);
|
TORRENT_ASSERT(block.block_index >= 0);
|
||||||
|
@ -2174,6 +2184,8 @@ namespace libtorrent
|
||||||
TORRENT_PIECE_PICKER_INVARIANT_CHECK;
|
TORRENT_PIECE_PICKER_INVARIANT_CHECK;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
TORRENT_ASSERT(peer == 0 || static_cast<policy::peer*>(peer)->in_use);
|
||||||
|
|
||||||
TORRENT_ASSERT(block.piece_index >= 0);
|
TORRENT_ASSERT(block.piece_index >= 0);
|
||||||
TORRENT_ASSERT(block.block_index >= 0);
|
TORRENT_ASSERT(block.block_index >= 0);
|
||||||
TORRENT_ASSERT(block.piece_index < m_piece_map.size());
|
TORRENT_ASSERT(block.piece_index < m_piece_map.size());
|
||||||
|
@ -2286,6 +2298,7 @@ namespace libtorrent
|
||||||
|
|
||||||
void piece_picker::mark_as_finished(piece_block block, void* peer)
|
void piece_picker::mark_as_finished(piece_block block, void* peer)
|
||||||
{
|
{
|
||||||
|
TORRENT_ASSERT(peer == 0 || static_cast<policy::peer*>(peer)->in_use);
|
||||||
TORRENT_ASSERT(block.piece_index >= 0);
|
TORRENT_ASSERT(block.piece_index >= 0);
|
||||||
TORRENT_ASSERT(block.block_index >= 0);
|
TORRENT_ASSERT(block.block_index >= 0);
|
||||||
TORRENT_ASSERT(block.piece_index < m_piece_map.size());
|
TORRENT_ASSERT(block.piece_index < m_piece_map.size());
|
||||||
|
@ -2365,6 +2378,7 @@ namespace libtorrent
|
||||||
d.clear();
|
d.clear();
|
||||||
for (int j = 0, end(blocks_in_piece(index)); j != end; ++j)
|
for (int j = 0, end(blocks_in_piece(index)); j != end; ++j)
|
||||||
{
|
{
|
||||||
|
TORRENT_ASSERT(i->info[j].peer == 0 || static_cast<policy::peer*>(i->info[j].peer)->in_use);
|
||||||
d.push_back(i->info[j].peer);
|
d.push_back(i->info[j].peer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2381,7 +2395,9 @@ namespace libtorrent
|
||||||
if (i->info[block.block_index].state == block_info::state_none)
|
if (i->info[block.block_index].state == block_info::state_none)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return i->info[block.block_index].peer;
|
void* peer = i->info[block.block_index].peer;
|
||||||
|
TORRENT_ASSERT(peer == 0 || static_cast<policy::peer*>(peer)->in_use);
|
||||||
|
return peer;
|
||||||
}
|
}
|
||||||
|
|
||||||
// this is called when a request is rejected or when
|
// this is called when a request is rejected or when
|
||||||
|
@ -2392,6 +2408,8 @@ namespace libtorrent
|
||||||
TORRENT_PIECE_PICKER_INVARIANT_CHECK;
|
TORRENT_PIECE_PICKER_INVARIANT_CHECK;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
TORRENT_ASSERT(peer == 0 || static_cast<policy::peer*>(peer)->in_use);
|
||||||
|
|
||||||
TORRENT_ASSERT(block.piece_index >= 0);
|
TORRENT_ASSERT(block.piece_index >= 0);
|
||||||
TORRENT_ASSERT(block.block_index >= 0);
|
TORRENT_ASSERT(block.block_index >= 0);
|
||||||
TORRENT_ASSERT(block.piece_index < m_piece_map.size());
|
TORRENT_ASSERT(block.piece_index < m_piece_map.size());
|
||||||
|
@ -2407,6 +2425,7 @@ namespace libtorrent
|
||||||
TORRENT_ASSERT(i != m_downloads.end());
|
TORRENT_ASSERT(i != m_downloads.end());
|
||||||
|
|
||||||
block_info& info = i->info[block.block_index];
|
block_info& info = i->info[block.block_index];
|
||||||
|
TORRENT_ASSERT(info.peer == 0 || static_cast<policy::peer*>(info.peer)->in_use);
|
||||||
TORRENT_ASSERT(info.piece_index == block.piece_index);
|
TORRENT_ASSERT(info.piece_index == block.piece_index);
|
||||||
|
|
||||||
TORRENT_ASSERT(info.state != block_info::state_none);
|
TORRENT_ASSERT(info.state != block_info::state_none);
|
||||||
|
@ -2434,7 +2453,7 @@ namespace libtorrent
|
||||||
info.state = block_info::state_none;
|
info.state = block_info::state_none;
|
||||||
--i->requested;
|
--i->requested;
|
||||||
update_full(*i);
|
update_full(*i);
|
||||||
}
|
}
|
||||||
|
|
||||||
// if there are no other blocks in this piece
|
// if there are no other blocks in this piece
|
||||||
// that's being downloaded, remove it from the list
|
// that's being downloaded, remove it from the list
|
||||||
|
|
|
@ -221,13 +221,18 @@ int test_pick(boost::shared_ptr<piece_picker> const& p, int options = piece_pick
|
||||||
|
|
||||||
int test_main()
|
int test_main()
|
||||||
{
|
{
|
||||||
|
|
||||||
int tmp1;
|
|
||||||
int tmp2;
|
|
||||||
int tmp3;
|
|
||||||
tcp::endpoint endp;
|
tcp::endpoint endp;
|
||||||
piece_picker::downloading_piece st;
|
piece_picker::downloading_piece st;
|
||||||
|
policy::ipv4_peer tmp1(endp, false, 0);
|
||||||
|
policy::ipv4_peer tmp2(endp, false, 0);
|
||||||
|
policy::ipv4_peer tmp3(endp, false, 0);
|
||||||
policy::ipv4_peer peer_struct(endp, true, 0);
|
policy::ipv4_peer peer_struct(endp, true, 0);
|
||||||
|
#if defined TORRENT_DEBUG || TORRENT_RELEASE_ASSERTS
|
||||||
|
tmp1.in_use = true;
|
||||||
|
tmp2.in_use = true;
|
||||||
|
tmp3.in_use = true;
|
||||||
|
peer_struct.in_use = true;
|
||||||
|
#endif
|
||||||
std::vector<piece_block> picked;
|
std::vector<piece_block> picked;
|
||||||
boost::shared_ptr<piece_picker> p;
|
boost::shared_ptr<piece_picker> p;
|
||||||
const std::vector<int> empty_vector;
|
const std::vector<int> empty_vector;
|
||||||
|
@ -303,23 +308,23 @@ int test_main()
|
||||||
TEST_CHECK(p->is_requested(piece_block(0, 0)) == false);
|
TEST_CHECK(p->is_requested(piece_block(0, 0)) == false);
|
||||||
TEST_CHECK(std::find(picked.begin(), picked.end(), piece_block(0,0)) != picked.end());
|
TEST_CHECK(std::find(picked.begin(), picked.end(), piece_block(0,0)) != picked.end());
|
||||||
|
|
||||||
p->mark_as_downloading(piece_block(0, 2), (void*)1337, piece_picker::fast);
|
p->mark_as_downloading(piece_block(0, 2), &tmp1, piece_picker::fast);
|
||||||
p->mark_as_writing(piece_block(0, 2), (void*)1337);
|
p->mark_as_writing(piece_block(0, 2), &tmp1);
|
||||||
p->abort_download(piece_block(0, 2), (void*)1337);
|
p->abort_download(piece_block(0, 2), &tmp1);
|
||||||
p->mark_as_downloading(piece_block(0, 2), (void*)7, piece_picker::fast);
|
p->mark_as_downloading(piece_block(0, 2), &tmp2, piece_picker::fast);
|
||||||
p->mark_as_writing(piece_block(0, 2), (void*)7);
|
p->mark_as_writing(piece_block(0, 2), &tmp2);
|
||||||
|
|
||||||
std::vector<void*> d;
|
std::vector<void*> d;
|
||||||
p->get_downloaders(d, 0);
|
p->get_downloaders(d, 0);
|
||||||
TEST_CHECK(d[2] == (void*)7);
|
TEST_CHECK(d[2] == &tmp2);
|
||||||
|
|
||||||
p->mark_as_downloading(piece_block(0, 3), (void*)1337, piece_picker::fast);
|
p->mark_as_downloading(piece_block(0, 3), &tmp1, piece_picker::fast);
|
||||||
p->abort_download(piece_block(0, 3), (void*)1337);
|
p->abort_download(piece_block(0, 3), &tmp1);
|
||||||
p->mark_as_downloading(piece_block(0, 3), (void*)7, piece_picker::fast);
|
p->mark_as_downloading(piece_block(0, 3), &tmp2, piece_picker::fast);
|
||||||
p->mark_as_writing(piece_block(0, 3), (void*)7);
|
p->mark_as_writing(piece_block(0, 3), &tmp2);
|
||||||
|
|
||||||
p->get_downloaders(d, 0);
|
p->get_downloaders(d, 0);
|
||||||
TEST_CHECK(d[3] == (void*)7);
|
TEST_CHECK(d[3] == &tmp2);
|
||||||
|
|
||||||
// ========================================================
|
// ========================================================
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue