fixes for metadata-less torrents, and fixes for peer requests

This commit is contained in:
Arvid Norberg 2007-02-15 03:03:50 +00:00
parent 14cb23cec2
commit 889ad70cee
3 changed files with 36 additions and 17 deletions

View File

@ -943,6 +943,10 @@ namespace libtorrent
, m_download_queue.end()
, block_finished);
// if there's another peer that needs to do another
// piece request, this will point to it
peer_connection* request_peer = 0;
if (b != m_download_queue.end())
{
if (m_assume_fifo)
@ -985,11 +989,7 @@ namespace libtorrent
if (pc && pc != this)
{
pc->cancel_request(block_finished);
if (!pc->has_peer_choked() && !t->is_seed())
{
request_a_block(*t, *pc);
pc->send_block_requests();
}
request_peer = pc;
}
}
else
@ -1015,6 +1015,12 @@ namespace libtorrent
t->received_redundant_data(t->block_size());
pol.block_finished(*this, block_finished);
send_block_requests();
if (request_peer && !request_peer->has_peer_choked() && !t->is_seed())
{
request_a_block(*t, *request_peer);
request_peer->send_block_requests();
}
return;
}
@ -1029,6 +1035,12 @@ namespace libtorrent
}
catch (std::exception const&) {}
if (request_peer && !request_peer->has_peer_choked() && !t->is_seed())
{
request_a_block(*t, *request_peer);
request_peer->send_block_requests();
}
#ifndef NDEBUG
try
{
@ -1765,7 +1777,7 @@ namespace libtorrent
#endif
// the upload queue should not have non-prioritized peers
t->request_bandwidth(upload_channel, self(), /*m_non_prioritized*/ false);
t->request_bandwidth(upload_channel, self(), false);
m_writing = true;
}
return;

View File

@ -2199,10 +2199,17 @@ namespace libtorrent
}
size_type total_done = quantized_bytes_done();
if (is_seed())
assert(total_done == m_torrent_file.total_size());
if (m_torrent_file.is_valid())
{
if (is_seed())
assert(total_done == m_torrent_file.total_size());
else
assert(total_done != m_torrent_file.total_size());
}
else
assert(total_done != m_torrent_file.total_size());
{
assert(total_done == 0);
}
// This check is very expensive.
assert(m_num_pieces

View File

@ -238,7 +238,7 @@ namespace libtorrent
// just the necessary to use it with piece manager
// used for torrents with no metadata
torrent_info::torrent_info(sha1_hash const& info_hash)
: m_piece_length(256 * 1024)
: m_piece_length(0)
, m_total_size(0)
, m_info_hash(info_hash)
, m_name()
@ -250,7 +250,7 @@ namespace libtorrent
}
torrent_info::torrent_info()
: m_piece_length(256 * 1024)
: m_piece_length(0)
, m_total_size(0)
, m_info_hash(0)
, m_name()
@ -543,18 +543,18 @@ namespace libtorrent
m_files.push_back(e);
m_total_size += size;
if (m_piece_length == 0)
m_piece_length = 256 * 1024;
int num_pieces = static_cast<int>(
(m_total_size + m_piece_length - 1) / m_piece_length);
int old_num_pieces = static_cast<int>(m_piece_hash.size());
m_piece_hash.resize(num_pieces);
for (std::vector<sha1_hash>::iterator i = m_piece_hash.begin() + old_num_pieces;
i != m_piece_hash.end(); ++i)
{
i->clear();
}
if (num_pieces > old_num_pieces)
std::for_each(m_piece_hash.begin() + old_num_pieces
, m_piece_hash.end(), boost::bind(&sha1_hash::clear, _1));
}
void torrent_info::add_url_seed(std::string const& url)