reverted bad check-in where files_checked was removed from piece_picker
This commit is contained in:
parent
8957b64c04
commit
7ff5893431
|
@ -112,15 +112,17 @@ namespace libtorrent
|
||||||
block_info info[max_blocks_per_piece];
|
block_info info[max_blocks_per_piece];
|
||||||
};
|
};
|
||||||
|
|
||||||
// the vector tells which pieces we already have
|
|
||||||
// and which we don't have.
|
|
||||||
piece_picker(int blocks_per_piece
|
piece_picker(int blocks_per_piece
|
||||||
, int total_num_blocks
|
, int total_num_blocks);
|
||||||
, std::vector<bool> const& pieces
|
|
||||||
, std::vector<downloading_piece> const& unfinished);
|
|
||||||
|
|
||||||
void set_sequenced_download_threshold(int sequenced_download_threshold);
|
void set_sequenced_download_threshold(int sequenced_download_threshold);
|
||||||
|
|
||||||
|
// the vector tells which pieces we already have
|
||||||
|
// and which we don't have.
|
||||||
|
void files_checked(
|
||||||
|
const std::vector<bool>& pieces
|
||||||
|
, const std::vector<downloading_piece>& unfinished);
|
||||||
|
|
||||||
// increases the peer count for the given piece
|
// increases the peer count for the given piece
|
||||||
// (is used when a HAVE or BITFIELD message is received)
|
// (is used when a HAVE or BITFIELD message is received)
|
||||||
void inc_refcount(int index);
|
void inc_refcount(int index);
|
||||||
|
@ -300,8 +302,8 @@ namespace libtorrent
|
||||||
}
|
}
|
||||||
|
|
||||||
void add(int index);
|
void add(int index);
|
||||||
//TODO: should be renamed update()
|
|
||||||
void move(int vec_index, int elem_index);
|
void move(int vec_index, int elem_index);
|
||||||
|
// void remove(int vec_index, int elem_index);
|
||||||
|
|
||||||
int add_interesting_blocks(const std::vector<int>& piece_list
|
int add_interesting_blocks(const std::vector<int>& piece_list
|
||||||
, const std::vector<bool>& pieces
|
, const std::vector<bool>& pieces
|
||||||
|
@ -350,6 +352,9 @@ namespace libtorrent
|
||||||
// the required popularity of a piece in order to download
|
// the required popularity of a piece in order to download
|
||||||
// it in sequence instead of random order.
|
// it in sequence instead of random order.
|
||||||
int m_sequenced_download_threshold;
|
int m_sequenced_download_threshold;
|
||||||
|
#ifndef NDEBUG
|
||||||
|
bool m_files_checked_called;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
inline int piece_picker::blocks_in_piece(int index) const
|
inline int piece_picker::blocks_in_piece(int index) const
|
||||||
|
|
|
@ -416,15 +416,13 @@ namespace libtorrent
|
||||||
alert_manager& alerts() const;
|
alert_manager& alerts() const;
|
||||||
piece_picker& picker()
|
piece_picker& picker()
|
||||||
{
|
{
|
||||||
assert(m_files_checked_called);
|
|
||||||
assert(!is_seed());
|
assert(!is_seed());
|
||||||
assert(m_picker.get());
|
assert(m_picker.get());
|
||||||
return *m_picker;
|
return *m_picker;
|
||||||
}
|
}
|
||||||
bool has_picker() const
|
bool has_picker() const
|
||||||
{
|
{
|
||||||
assert((m_files_checked_called && !is_seed())
|
assert((valid_metadata() && !is_seed()) == bool(m_picker.get()));
|
||||||
== bool(m_picker.get()));
|
|
||||||
return m_picker.get();
|
return m_picker.get();
|
||||||
}
|
}
|
||||||
policy& get_policy()
|
policy& get_policy()
|
||||||
|
@ -686,10 +684,6 @@ namespace libtorrent
|
||||||
// is started. i.e.
|
// is started. i.e.
|
||||||
// total_done - m_initial_done <= total_payload_download
|
// total_done - m_initial_done <= total_payload_download
|
||||||
size_type m_initial_done;
|
size_type m_initial_done;
|
||||||
|
|
||||||
// set to true once files_checked has been called
|
|
||||||
// and the piece picker is constructed
|
|
||||||
bool m_files_checked_called;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef TORRENT_LOGGING
|
#ifdef TORRENT_LOGGING
|
||||||
|
|
|
@ -54,9 +54,7 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
namespace libtorrent
|
namespace libtorrent
|
||||||
{
|
{
|
||||||
|
|
||||||
piece_picker::piece_picker(int blocks_per_piece, int total_num_blocks
|
piece_picker::piece_picker(int blocks_per_piece, int total_num_blocks)
|
||||||
, std::vector<bool> const& pieces
|
|
||||||
, std::vector<downloading_piece> const& unfinished)
|
|
||||||
: m_piece_info(2)
|
: m_piece_info(2)
|
||||||
, m_piece_map((total_num_blocks + blocks_per_piece-1) / blocks_per_piece)
|
, m_piece_map((total_num_blocks + blocks_per_piece-1) / blocks_per_piece)
|
||||||
, m_num_filtered(0)
|
, m_num_filtered(0)
|
||||||
|
@ -65,6 +63,9 @@ namespace libtorrent
|
||||||
{
|
{
|
||||||
assert(blocks_per_piece > 0);
|
assert(blocks_per_piece > 0);
|
||||||
assert(total_num_blocks >= 0);
|
assert(total_num_blocks >= 0);
|
||||||
|
#ifndef NDEBUG
|
||||||
|
m_files_checked_called = false;
|
||||||
|
#endif
|
||||||
|
|
||||||
// the piece index is stored in 20 bits, which limits the allowed
|
// the piece index is stored in 20 bits, which limits the allowed
|
||||||
// number of pieces somewhat
|
// number of pieces somewhat
|
||||||
|
@ -83,8 +84,16 @@ namespace libtorrent
|
||||||
// and make them invalid (as if though we already had every piece)
|
// and make them invalid (as if though we already had every 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, piece_pos::we_have_index));
|
||||||
|
}
|
||||||
|
|
||||||
|
// pieces is a bitmask with the pieces we have
|
||||||
|
void piece_picker::files_checked(
|
||||||
|
const std::vector<bool>& pieces
|
||||||
|
, const std::vector<downloading_piece>& unfinished)
|
||||||
|
{
|
||||||
|
#ifndef NDEBUG
|
||||||
|
m_files_checked_called = true;
|
||||||
|
#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)
|
||||||
{
|
{
|
||||||
|
@ -119,7 +128,6 @@ namespace libtorrent
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void piece_picker::set_sequenced_download_threshold(
|
void piece_picker::set_sequenced_download_threshold(
|
||||||
|
@ -370,6 +378,7 @@ namespace libtorrent
|
||||||
{
|
{
|
||||||
assert(priority > 0);
|
assert(priority > 0);
|
||||||
assert(elem_index >= 0);
|
assert(elem_index >= 0);
|
||||||
|
assert(m_files_checked_called);
|
||||||
|
|
||||||
assert(int(m_piece_info.size()) > priority);
|
assert(int(m_piece_info.size()) > priority);
|
||||||
assert(int(m_piece_info[priority].size()) > elem_index);
|
assert(int(m_piece_info[priority].size()) > elem_index);
|
||||||
|
@ -525,6 +534,7 @@ namespace libtorrent
|
||||||
|
|
||||||
assert(index >= 0);
|
assert(index >= 0);
|
||||||
assert(index < (int)m_piece_map.size());
|
assert(index < (int)m_piece_map.size());
|
||||||
|
assert(m_files_checked_called);
|
||||||
|
|
||||||
assert(m_piece_map[index].downloading == 1);
|
assert(m_piece_map[index].downloading == 1);
|
||||||
|
|
||||||
|
@ -546,6 +556,7 @@ namespace libtorrent
|
||||||
// TORRENT_PIECE_PICKER_INVARIANT_CHECK;
|
// TORRENT_PIECE_PICKER_INVARIANT_CHECK;
|
||||||
assert(i >= 0);
|
assert(i >= 0);
|
||||||
assert(i < (int)m_piece_map.size());
|
assert(i < (int)m_piece_map.size());
|
||||||
|
assert(m_files_checked_called);
|
||||||
|
|
||||||
piece_pos& p = m_piece_map[i];
|
piece_pos& p = m_piece_map[i];
|
||||||
int index = p.index;
|
int index = p.index;
|
||||||
|
@ -578,6 +589,7 @@ namespace libtorrent
|
||||||
{
|
{
|
||||||
// TORRENT_PIECE_PICKER_INVARIANT_CHECK;
|
// TORRENT_PIECE_PICKER_INVARIANT_CHECK;
|
||||||
|
|
||||||
|
assert(m_files_checked_called);
|
||||||
assert(i >= 0);
|
assert(i >= 0);
|
||||||
assert(i < (int)m_piece_map.size());
|
assert(i < (int)m_piece_map.size());
|
||||||
|
|
||||||
|
@ -744,6 +756,7 @@ namespace libtorrent
|
||||||
TORRENT_PIECE_PICKER_INVARIANT_CHECK;
|
TORRENT_PIECE_PICKER_INVARIANT_CHECK;
|
||||||
assert(num_blocks > 0);
|
assert(num_blocks > 0);
|
||||||
assert(pieces.size() == m_piece_map.size());
|
assert(pieces.size() == m_piece_map.size());
|
||||||
|
assert(m_files_checked_called);
|
||||||
|
|
||||||
// free refers to pieces that are free to download, no one else
|
// free refers to pieces that are free to download, no one else
|
||||||
// is downloading them.
|
// is downloading them.
|
||||||
|
|
|
@ -274,7 +274,6 @@ namespace libtorrent
|
||||||
{
|
{
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
m_initial_done = 0;
|
m_initial_done = 0;
|
||||||
m_files_checked_called = false;
|
|
||||||
#endif
|
#endif
|
||||||
#ifdef TORRENT_LOGGING
|
#ifdef TORRENT_LOGGING
|
||||||
m_log = ses.create_log("torrent_"
|
m_log = ses.create_log("torrent_"
|
||||||
|
@ -366,7 +365,6 @@ namespace libtorrent
|
||||||
{
|
{
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
m_initial_done = 0;
|
m_initial_done = 0;
|
||||||
m_files_checked_called = false;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef TORRENT_LOGGING
|
#ifdef TORRENT_LOGGING
|
||||||
|
@ -466,6 +464,9 @@ namespace libtorrent
|
||||||
m_storage.reset(new piece_manager(m_torrent_file, m_save_path
|
m_storage.reset(new piece_manager(m_torrent_file, m_save_path
|
||||||
, m_ses.m_files, m_storage_constructor));
|
, m_ses.m_files, m_storage_constructor));
|
||||||
m_block_size = calculate_block_size(m_torrent_file, m_default_block_size);
|
m_block_size = calculate_block_size(m_torrent_file, m_default_block_size);
|
||||||
|
m_picker.reset(new piece_picker(
|
||||||
|
static_cast<int>(m_torrent_file.piece_length() / m_block_size)
|
||||||
|
, static_cast<int>((m_torrent_file.total_size()+m_block_size-1)/m_block_size)));
|
||||||
|
|
||||||
std::vector<std::string> const& url_seeds = m_torrent_file.url_seeds();
|
std::vector<std::string> const& url_seeds = m_torrent_file.url_seeds();
|
||||||
std::copy(url_seeds.begin(), url_seeds.end(), std::inserter(m_web_seeds
|
std::copy(url_seeds.begin(), url_seeds.end(), std::inserter(m_web_seeds
|
||||||
|
@ -705,7 +706,7 @@ namespace libtorrent
|
||||||
{
|
{
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
|
|
||||||
if (!has_picker() || m_torrent_file.num_pieces() == 0)
|
if (!valid_metadata() || m_torrent_file.num_pieces() == 0)
|
||||||
return tuple<size_type, size_type>(0,0);
|
return tuple<size_type, size_type>(0,0);
|
||||||
|
|
||||||
const int last_piece = m_torrent_file.num_pieces() - 1;
|
const int last_piece = m_torrent_file.num_pieces() - 1;
|
||||||
|
@ -2136,18 +2137,15 @@ namespace libtorrent
|
||||||
|
|
||||||
if (!is_seed())
|
if (!is_seed())
|
||||||
{
|
{
|
||||||
m_picker.reset(new piece_picker(
|
m_picker->files_checked(m_have_pieces, unfinished_pieces);
|
||||||
static_cast<int>(m_torrent_file.piece_length() / m_block_size)
|
|
||||||
, static_cast<int>((m_torrent_file.total_size()+m_block_size-1)/m_block_size)
|
|
||||||
, m_have_pieces, unfinished_pieces));
|
|
||||||
m_files_checked_called = true;
|
|
||||||
if (m_sequenced_download_threshold > 0)
|
if (m_sequenced_download_threshold > 0)
|
||||||
picker().set_sequenced_download_threshold(m_sequenced_download_threshold);
|
picker().set_sequenced_download_threshold(m_sequenced_download_threshold);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
assert(!m_picker);
|
m_picker.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!m_connections_initialized)
|
if (!m_connections_initialized)
|
||||||
{
|
{
|
||||||
m_connections_initialized = true;
|
m_connections_initialized = true;
|
||||||
|
|
Loading…
Reference in New Issue