fixed sign-compare warnings and some refactor (#1354)
fixed sign-compare warnings and some refactor. make sequence_number backed by std::int64_t
This commit is contained in:
parent
0df9d1c641
commit
d5c4cd7280
1
Jamfile
1
Jamfile
|
@ -245,7 +245,6 @@ rule warnings ( properties * )
|
||||||
|
|
||||||
# enable these warnings again, once the other ones are dealt with
|
# enable these warnings again, once the other ones are dealt with
|
||||||
result += <cflags>-Wno-weak-vtables ;
|
result += <cflags>-Wno-weak-vtables ;
|
||||||
result += <cflags>-Wno-sign-compare ;
|
|
||||||
result += <cflags>-Wno-sign-conversion ;
|
result += <cflags>-Wno-sign-conversion ;
|
||||||
result += <cflags>-Wno-shorten-64-to-32 ;
|
result += <cflags>-Wno-shorten-64-to-32 ;
|
||||||
}
|
}
|
||||||
|
|
|
@ -446,7 +446,7 @@ namespace
|
||||||
ses.dht_get_item(public_key, salt);
|
ses.dht_get_item(public_key, salt);
|
||||||
}
|
}
|
||||||
|
|
||||||
void put_string(entry& e, std::array<char, 64>& sig, std::uint64_t& seq
|
void put_string(entry& e, std::array<char, 64>& sig, std::int64_t& seq
|
||||||
, std::string const& salt, std::string pk, std::string sk
|
, std::string const& salt, std::string pk, std::string sk
|
||||||
, std::string data)
|
, std::string data)
|
||||||
{
|
{
|
||||||
|
@ -470,7 +470,7 @@ namespace
|
||||||
TORRENT_ASSERT(public_key.size() == 32);
|
TORRENT_ASSERT(public_key.size() == 32);
|
||||||
std::array<char, 32> key;
|
std::array<char, 32> key;
|
||||||
std::copy(public_key.begin(), public_key.end(), key.begin());
|
std::copy(public_key.begin(), public_key.end(), key.begin());
|
||||||
ses.dht_put_item(key, [&](entry& e, std::array<char, 64>& sig, std::uint64_t& seq
|
ses.dht_put_item(key, [&](entry& e, std::array<char, 64>& sig, std::int64_t& seq
|
||||||
, std::string const& salt) { put_string(e, sig, seq, salt
|
, std::string const& salt) { put_string(e, sig, seq, salt
|
||||||
, public_key, private_key, data); }
|
, public_key, private_key, data); }
|
||||||
, salt);
|
, salt);
|
||||||
|
|
|
@ -391,7 +391,7 @@ namespace libtorrent
|
||||||
|
|
||||||
void dht_put_mutable_item(std::array<char, 32> key
|
void dht_put_mutable_item(std::array<char, 32> key
|
||||||
, std::function<void(entry&, std::array<char,64>&
|
, std::function<void(entry&, std::array<char,64>&
|
||||||
, std::uint64_t&, std::string const&)> cb
|
, std::int64_t&, std::string const&)> cb
|
||||||
, std::string salt = std::string());
|
, std::string salt = std::string());
|
||||||
|
|
||||||
void dht_get_peers(sha1_hash const& info_hash);
|
void dht_get_peers(sha1_hash const& info_hash);
|
||||||
|
|
|
@ -312,7 +312,7 @@ namespace libtorrent
|
||||||
// ---- 32 bit boundary ---
|
// ---- 32 bit boundary ---
|
||||||
|
|
||||||
// the sum of all refcounts in all blocks
|
// the sum of all refcounts in all blocks
|
||||||
std::uint32_t refcount = 0;
|
std::int32_t refcount = 0;
|
||||||
|
|
||||||
#if TORRENT_USE_ASSERTS
|
#if TORRENT_USE_ASSERTS
|
||||||
// the number of times this piece has finished hashing
|
// the number of times this piece has finished hashing
|
||||||
|
@ -339,11 +339,11 @@ namespace libtorrent
|
||||||
std::size_t operator()(cached_piece_entry const& p) const
|
std::size_t operator()(cached_piece_entry const& p) const
|
||||||
{ return std::size_t(p.storage.get()) + std::size_t(p.piece); }
|
{ return std::size_t(p.storage.get()) + std::size_t(p.piece); }
|
||||||
};
|
};
|
||||||
typedef std::unordered_set<cached_piece_entry, hash_value> cache_t;
|
using cache_t = std::unordered_set<cached_piece_entry, hash_value>;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
typedef cache_t::const_iterator const_iterator;
|
using const_iterator = cache_t::const_iterator;
|
||||||
|
|
||||||
// returns the number of blocks this job would cause to be read in
|
// returns the number of blocks this job would cause to be read in
|
||||||
int pad_job(disk_io_job const* j, int blocks_in_piece
|
int pad_job(disk_io_job const* j, int blocks_in_piece
|
||||||
|
@ -359,7 +359,7 @@ namespace libtorrent
|
||||||
list_iterator<cached_piece_entry> write_lru_pieces() const
|
list_iterator<cached_piece_entry> write_lru_pieces() const
|
||||||
{ return m_lru[cached_piece_entry::write_lru].iterate(); }
|
{ return m_lru[cached_piece_entry::write_lru].iterate(); }
|
||||||
|
|
||||||
int num_write_lru_pieces() const { return int(m_lru[cached_piece_entry::write_lru].size()); }
|
int num_write_lru_pieces() const { return m_lru[cached_piece_entry::write_lru].size(); }
|
||||||
|
|
||||||
// mark this piece for deletion. If there are no outstanding
|
// mark this piece for deletion. If there are no outstanding
|
||||||
// requests to this piece, it's removed immediately, and the
|
// requests to this piece, it's removed immediately, and the
|
||||||
|
@ -507,21 +507,21 @@ namespace libtorrent
|
||||||
int m_max_volatile_blocks;
|
int m_max_volatile_blocks;
|
||||||
|
|
||||||
// the number of blocks (buffers) allocated by volatile pieces.
|
// the number of blocks (buffers) allocated by volatile pieces.
|
||||||
std::uint32_t m_volatile_size;
|
std::int32_t m_volatile_size;
|
||||||
|
|
||||||
// the number of blocks in the cache
|
// the number of blocks in the cache
|
||||||
// that are in the read cache
|
// that are in the read cache
|
||||||
std::uint32_t m_read_cache_size;
|
std::int32_t m_read_cache_size;
|
||||||
|
|
||||||
// the number of blocks in the cache
|
// the number of blocks in the cache
|
||||||
// that are in the write cache
|
// that are in the write cache
|
||||||
std::uint32_t m_write_cache_size;
|
std::int32_t m_write_cache_size;
|
||||||
|
|
||||||
// the number of blocks that are currently sitting
|
// the number of blocks that are currently sitting
|
||||||
// in peer's send buffers. If two peers are sending
|
// in peer's send buffers. If two peers are sending
|
||||||
// the same block, it counts as 2, even though there're
|
// the same block, it counts as 2, even though there're
|
||||||
// no buffer duplication
|
// no buffer duplication
|
||||||
std::uint32_t m_send_buffer_blocks;
|
std::int32_t m_send_buffer_blocks;
|
||||||
|
|
||||||
// the number of blocks with a refcount > 0, i.e.
|
// the number of blocks with a refcount > 0, i.e.
|
||||||
// they may not be evicted
|
// they may not be evicted
|
||||||
|
|
|
@ -87,12 +87,12 @@ namespace libtorrent
|
||||||
|
|
||||||
void release_memory();
|
void release_memory();
|
||||||
|
|
||||||
std::uint32_t in_use() const
|
int in_use() const
|
||||||
{
|
{
|
||||||
std::unique_lock<std::mutex> l(m_pool_mutex);
|
std::unique_lock<std::mutex> l(m_pool_mutex);
|
||||||
return m_in_use;
|
return m_in_use;
|
||||||
}
|
}
|
||||||
std::uint32_t num_to_evict(int num_needed = 0);
|
int num_to_evict(int num_needed = 0);
|
||||||
|
|
||||||
void set_settings(aux::session_settings const& sett, error_code& ec);
|
void set_settings(aux::session_settings const& sett, error_code& ec);
|
||||||
|
|
||||||
|
|
|
@ -354,7 +354,7 @@ namespace libtorrent
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(index >= 0);
|
TORRENT_ASSERT(index >= 0);
|
||||||
TORRENT_ASSERT(index < int(m_files.size()));
|
TORRENT_ASSERT(index < int(m_files.size()));
|
||||||
return m_files[index];
|
return m_files[std::size_t(index)];
|
||||||
}
|
}
|
||||||
TORRENT_DEPRECATED
|
TORRENT_DEPRECATED
|
||||||
file_entry at(iterator i) const;
|
file_entry at(iterator i) const;
|
||||||
|
|
|
@ -140,7 +140,7 @@ namespace detail
|
||||||
m_access_list.insert(range(zero<Addr>(), 0));
|
m_access_list.insert(range(zero<Addr>(), 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
void add_rule(Addr first, Addr last, int flags)
|
void add_rule(Addr first, Addr last, std::uint32_t const flags)
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(!m_access_list.empty());
|
TORRENT_ASSERT(!m_access_list.empty());
|
||||||
TORRENT_ASSERT(first < last || first == last);
|
TORRENT_ASSERT(first < last || first == last);
|
||||||
|
@ -212,7 +212,7 @@ namespace detail
|
||||||
std::vector<ip_range<ExternalAddressType>> ret;
|
std::vector<ip_range<ExternalAddressType>> ret;
|
||||||
ret.reserve(m_access_list.size());
|
ret.reserve(m_access_list.size());
|
||||||
|
|
||||||
for (typename range_t::const_iterator i = m_access_list.begin()
|
for (auto i = m_access_list.begin()
|
||||||
, end(m_access_list.end()); i != end;)
|
, end(m_access_list.end()); i != end;)
|
||||||
{
|
{
|
||||||
ip_range<ExternalAddressType> r;
|
ip_range<ExternalAddressType> r;
|
||||||
|
@ -234,7 +234,7 @@ namespace detail
|
||||||
|
|
||||||
struct range
|
struct range
|
||||||
{
|
{
|
||||||
range(Addr addr, int a = 0): start(addr), access(a) {} // NOLINT
|
range(Addr addr, std::uint32_t a = 0) : start(addr), access(a) {} // NOLINT
|
||||||
bool operator<(range const& r) const { return start < r.start; }
|
bool operator<(range const& r) const { return start < r.start; }
|
||||||
bool operator<(Addr const& a) const { return start < a; }
|
bool operator<(Addr const& a) const { return start < a; }
|
||||||
Addr start;
|
Addr start;
|
||||||
|
@ -243,8 +243,7 @@ namespace detail
|
||||||
std::uint32_t access;
|
std::uint32_t access;
|
||||||
};
|
};
|
||||||
|
|
||||||
using range_t = std::set<range>;
|
std::set<range> m_access_list;
|
||||||
range_t m_access_list;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,7 +73,7 @@ namespace libtorrent { namespace dht
|
||||||
struct sequence_number
|
struct sequence_number
|
||||||
{
|
{
|
||||||
sequence_number() : value(0) {}
|
sequence_number() : value(0) {}
|
||||||
explicit sequence_number(std::uint64_t v) : value(v) {}
|
explicit sequence_number(std::int64_t v) : value(v) {}
|
||||||
sequence_number(sequence_number const& sqn) = default;
|
sequence_number(sequence_number const& sqn) = default;
|
||||||
bool operator<(sequence_number rhs) const
|
bool operator<(sequence_number rhs) const
|
||||||
{ return value < rhs.value; }
|
{ return value < rhs.value; }
|
||||||
|
@ -87,7 +87,7 @@ namespace libtorrent { namespace dht
|
||||||
{ return value == rhs.value; }
|
{ return value == rhs.value; }
|
||||||
sequence_number& operator++()
|
sequence_number& operator++()
|
||||||
{ ++value; return *this; }
|
{ ++value; return *this; }
|
||||||
std::uint64_t value;
|
std::int64_t value;
|
||||||
};
|
};
|
||||||
|
|
||||||
}}
|
}}
|
||||||
|
|
|
@ -50,7 +50,7 @@ namespace libtorrent {
|
||||||
peer_class_t class_at(int i) const
|
peer_class_t class_at(int i) const
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(i >= 0 && i < int(m_size));
|
TORRENT_ASSERT(i >= 0 && i < int(m_size));
|
||||||
return m_class[i];
|
return m_class[std::size_t(i)];
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -63,4 +63,3 @@ namespace libtorrent
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -125,7 +125,7 @@ namespace libtorrent
|
||||||
|
|
||||||
struct downloading_piece
|
struct downloading_piece
|
||||||
{
|
{
|
||||||
downloading_piece() : index((std::numeric_limits<std::uint32_t>::max)())
|
downloading_piece() : index(std::numeric_limits<std::int32_t>::max())
|
||||||
, info_idx((std::numeric_limits<std::uint16_t>::max)())
|
, info_idx((std::numeric_limits<std::uint16_t>::max)())
|
||||||
, finished(0)
|
, finished(0)
|
||||||
, passed_hash_check(0)
|
, passed_hash_check(0)
|
||||||
|
@ -137,7 +137,7 @@ namespace libtorrent
|
||||||
bool operator<(downloading_piece const& rhs) const { return index < rhs.index; }
|
bool operator<(downloading_piece const& rhs) const { return index < rhs.index; }
|
||||||
|
|
||||||
// the index of the piece
|
// the index of the piece
|
||||||
std::uint32_t index;
|
std::int32_t index;
|
||||||
|
|
||||||
// info about each block in this piece. this is an index into the
|
// info about each block in this piece. this is an index into the
|
||||||
// m_block_info array, when multiplied by m_blocks_per_piece.
|
// m_block_info array, when multiplied by m_blocks_per_piece.
|
||||||
|
@ -223,7 +223,7 @@ namespace libtorrent
|
||||||
TORRENT_ASSERT(index >= 0);
|
TORRENT_ASSERT(index >= 0);
|
||||||
TORRENT_ASSERT(index < int(m_piece_map.size()));
|
TORRENT_ASSERT(index < int(m_piece_map.size()));
|
||||||
|
|
||||||
piece_pos const& p = m_piece_map[index];
|
piece_pos const& p = m_piece_map[std::size_t(index)];
|
||||||
return p.downloading();
|
return p.downloading();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -418,10 +418,10 @@ namespace libtorrent
|
||||||
// functor that compares indices on downloading_pieces
|
// functor that compares indices on downloading_pieces
|
||||||
struct has_index
|
struct has_index
|
||||||
{
|
{
|
||||||
explicit has_index(int i): index(std::uint32_t(i)) { TORRENT_ASSERT(i >= 0); }
|
explicit has_index(int i) : index(i) { TORRENT_ASSERT(i >= 0); }
|
||||||
bool operator()(const downloading_piece& p) const
|
bool operator()(downloading_piece const& p) const
|
||||||
{ return p.index == index; }
|
{ return p.index == index; }
|
||||||
std::uint32_t index;
|
std::int32_t index;
|
||||||
};
|
};
|
||||||
|
|
||||||
int blocks_in_last_piece() const
|
int blocks_in_last_piece() const
|
||||||
|
@ -697,9 +697,8 @@ namespace libtorrent
|
||||||
// shuffles the given piece inside it's priority range
|
// shuffles the given piece inside it's priority range
|
||||||
void shuffle(int priority, int elem_index);
|
void shuffle(int priority, int elem_index);
|
||||||
|
|
||||||
typedef std::vector<downloading_piece>::iterator dlpiece_iter;
|
std::vector<downloading_piece>::iterator add_download_piece(int index);
|
||||||
dlpiece_iter add_download_piece(int index);
|
void erase_download_piece(std::vector<downloading_piece>::iterator i);
|
||||||
void erase_download_piece(dlpiece_iter i);
|
|
||||||
|
|
||||||
std::vector<downloading_piece>::const_iterator find_dl_piece(int queue, int index) const;
|
std::vector<downloading_piece>::const_iterator find_dl_piece(int queue, int index) const;
|
||||||
std::vector<downloading_piece>::iterator find_dl_piece(int queue, int index);
|
std::vector<downloading_piece>::iterator find_dl_piece(int queue, int index);
|
||||||
|
|
|
@ -407,7 +407,7 @@ namespace libtorrent
|
||||||
// To generate the signature, you may want to use the
|
// To generate the signature, you may want to use the
|
||||||
// ``sign_mutable_item`` function.
|
// ``sign_mutable_item`` function.
|
||||||
//
|
//
|
||||||
// std::uint64_t& seq
|
// std::int64_t& seq
|
||||||
// current sequence number. May be zero if there is no current value.
|
// current sequence number. May be zero if there is no current value.
|
||||||
// The function is expected to set this to the new sequence number of
|
// The function is expected to set this to the new sequence number of
|
||||||
// the value that is to be stored. Sequence numbers must be monotonically
|
// the value that is to be stored. Sequence numbers must be monotonically
|
||||||
|
@ -429,7 +429,7 @@ namespace libtorrent
|
||||||
// calling the callback in between is convenient.
|
// calling the callback in between is convenient.
|
||||||
void dht_put_item(std::array<char, 32> key
|
void dht_put_item(std::array<char, 32> key
|
||||||
, std::function<void(entry&, std::array<char, 64>&
|
, std::function<void(entry&, std::array<char, 64>&
|
||||||
, std::uint64_t&, std::string const&)> cb
|
, std::int64_t&, std::string const&)> cb
|
||||||
, std::string salt = std::string());
|
, std::string salt = std::string());
|
||||||
|
|
||||||
void dht_get_peers(sha1_hash const& info_hash);
|
void dht_get_peers(sha1_hash const& info_hash);
|
||||||
|
|
|
@ -231,12 +231,12 @@ namespace libtorrent
|
||||||
}
|
}
|
||||||
|
|
||||||
// accessors for specific bytes
|
// accessors for specific bytes
|
||||||
std::uint8_t& operator[](size_t i)
|
std::uint8_t& operator[](std::size_t i)
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(i < size());
|
TORRENT_ASSERT(i < size());
|
||||||
return reinterpret_cast<std::uint8_t*>(m_number)[i];
|
return reinterpret_cast<std::uint8_t*>(m_number)[i];
|
||||||
}
|
}
|
||||||
std::uint8_t const& operator[](size_t i) const
|
std::uint8_t const& operator[](std::size_t i) const
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(i < size());
|
TORRENT_ASSERT(i < size());
|
||||||
return reinterpret_cast<std::uint8_t const*>(m_number)[i];
|
return reinterpret_cast<std::uint8_t const*>(m_number)[i];
|
||||||
|
|
|
@ -103,14 +103,14 @@ struct average_accumulator
|
||||||
// let the average roll over, but only be worth a
|
// let the average roll over, but only be worth a
|
||||||
// single sample
|
// single sample
|
||||||
m_num_samples = 1;
|
m_num_samples = 1;
|
||||||
m_sample_sum = std::uint64_t(ret);
|
m_sample_sum = ret;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
int m_num_samples = 0;
|
int m_num_samples = 0;
|
||||||
std::uint64_t m_sample_sum = 0;
|
std::int64_t m_sample_sum = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -317,7 +317,7 @@ TORRENT_TEST(dht_dual_stack_mutable_item)
|
||||||
std::tie(pk, sk) = lt::dht::ed25519_create_keypair(seed);
|
std::tie(pk, sk) = lt::dht::ed25519_create_keypair(seed);
|
||||||
|
|
||||||
ses.dht_put_item(pk.bytes, [&](lt::entry& item, std::array<char, 64>& sig
|
ses.dht_put_item(pk.bytes, [&](lt::entry& item, std::array<char, 64>& sig
|
||||||
, std::uint64_t& seq, std::string const& salt)
|
, std::int64_t& seq, std::string const& salt)
|
||||||
{
|
{
|
||||||
item = "mutable item";
|
item = "mutable item";
|
||||||
seq = 1;
|
seq = 1;
|
||||||
|
|
|
@ -1778,13 +1778,12 @@ namespace libtorrent {
|
||||||
// this specific output is parsed by tools/parse_session_stats.py
|
// this specific output is parsed by tools/parse_session_stats.py
|
||||||
// if this is changed, that parser should also be changed
|
// if this is changed, that parser should also be changed
|
||||||
char msg[50];
|
char msg[50];
|
||||||
std::snprintf(msg, sizeof(msg), "session stats (%d values): "
|
std::snprintf(msg, sizeof(msg), "session stats (%d values): " , int(values.size()));
|
||||||
, int(values.size()));
|
|
||||||
std::string ret = msg;
|
std::string ret = msg;
|
||||||
bool first = true;
|
bool first = true;
|
||||||
for (int i = 0; i < values.size(); ++i)
|
for (auto v : values)
|
||||||
{
|
{
|
||||||
std::snprintf(msg, sizeof(msg), first ? "%" PRIu64 : ", %" PRIu64, values[i]);
|
std::snprintf(msg, sizeof(msg), first ? "%" PRId64 : ", %" PRId64, v);
|
||||||
first = false;
|
first = false;
|
||||||
ret += msg;
|
ret += msg;
|
||||||
}
|
}
|
||||||
|
|
|
@ -281,10 +281,12 @@ static_assert(sizeof(job_action_name)/sizeof(job_action_name[0])
|
||||||
, int(pe->num_blocks), int(pe->blocks_in_piece), int(pe->hashing_done)
|
, int(pe->num_blocks), int(pe->blocks_in_piece), int(pe->hashing_done)
|
||||||
, int(pe->marked_for_deletion), int(pe->need_readback), pe->hash_passes
|
, int(pe->marked_for_deletion), int(pe->need_readback), pe->hash_passes
|
||||||
, int(pe->read_jobs.size()), int(pe->jobs.size()));
|
, int(pe->read_jobs.size()), int(pe->jobs.size()));
|
||||||
for (int i = 0; i < pe->piece_log.size(); ++i)
|
bool first = true;
|
||||||
|
for (auto const& log : pe->piece_log)
|
||||||
{
|
{
|
||||||
assert_print("%s %s (%d)", (i==0?"":",")
|
assert_print("%s %s (%d)", (first ? "" : ",")
|
||||||
, job_name(pe->piece_log[i].job), pe->piece_log[i].block);
|
, job_name(log.job), log.block);
|
||||||
|
first = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
assert_print("\n");
|
assert_print("\n");
|
||||||
|
@ -1259,7 +1261,7 @@ int block_cache::pad_job(disk_io_job const* j, int blocks_in_piece
|
||||||
}
|
}
|
||||||
|
|
||||||
void block_cache::insert_blocks(cached_piece_entry* pe, int block, span<file::iovec_t const> iov
|
void block_cache::insert_blocks(cached_piece_entry* pe, int block, span<file::iovec_t const> iov
|
||||||
, disk_io_job* j, int flags)
|
, disk_io_job* j, int const flags)
|
||||||
{
|
{
|
||||||
#ifdef TORRENT_EXPENSIVE_INVARIANT_CHECKS
|
#ifdef TORRENT_EXPENSIVE_INVARIANT_CHECKS
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
|
@ -1273,17 +1275,17 @@ void block_cache::insert_blocks(cached_piece_entry* pe, int block, span<file::io
|
||||||
|
|
||||||
TORRENT_ASSERT(pe->in_use);
|
TORRENT_ASSERT(pe->in_use);
|
||||||
|
|
||||||
for (int i = 0; i < iov.size(); ++i, ++block)
|
for (auto const& buf : iov)
|
||||||
{
|
{
|
||||||
// each iovec buffer has to be the size of a block (or the size of the last block)
|
// each iovec buffer has to be the size of a block (or the size of the last block)
|
||||||
TORRENT_PIECE_ASSERT(iov[i].iov_len == (std::min)(block_size()
|
TORRENT_PIECE_ASSERT(int(buf.iov_len) == std::min(block_size()
|
||||||
, pe->storage->files()->piece_size(pe->piece) - block * block_size()), pe);
|
, pe->storage->files()->piece_size(pe->piece) - block * block_size()), pe);
|
||||||
|
|
||||||
// no nullptrs allowed
|
// no nullptrs allowed
|
||||||
TORRENT_ASSERT(iov[i].iov_base);
|
TORRENT_ASSERT(buf.iov_base != nullptr);
|
||||||
|
|
||||||
#ifdef TORRENT_DEBUG_BUFFERS
|
#ifdef TORRENT_DEBUG_BUFFERS
|
||||||
TORRENT_PIECE_ASSERT(is_disk_buffer(static_cast<char*>(iov[i].iov_base)), pe);
|
TORRENT_PIECE_ASSERT(is_disk_buffer(static_cast<char*>(buf.iov_base)), pe);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (pe->blocks[block].buf && (flags & blocks_inc_refcount))
|
if (pe->blocks[block].buf && (flags & blocks_inc_refcount))
|
||||||
|
@ -1294,13 +1296,13 @@ void block_cache::insert_blocks(cached_piece_entry* pe, int block, span<file::io
|
||||||
// either free the block or insert it. Never replace a block
|
// either free the block or insert it. Never replace a block
|
||||||
if (pe->blocks[block].buf)
|
if (pe->blocks[block].buf)
|
||||||
{
|
{
|
||||||
free_buffer(static_cast<char*>(iov[i].iov_base));
|
free_buffer(static_cast<char*>(buf.iov_base));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
pe->blocks[block].buf = static_cast<char*>(iov[i].iov_base);
|
pe->blocks[block].buf = static_cast<char*>(buf.iov_base);
|
||||||
|
|
||||||
TORRENT_PIECE_ASSERT(iov[i].iov_base != nullptr, pe);
|
TORRENT_PIECE_ASSERT(buf.iov_base != nullptr, pe);
|
||||||
TORRENT_PIECE_ASSERT(pe->blocks[block].dirty == false, pe);
|
TORRENT_PIECE_ASSERT(pe->blocks[block].dirty == false, pe);
|
||||||
++pe->num_blocks;
|
++pe->num_blocks;
|
||||||
++m_read_cache_size;
|
++m_read_cache_size;
|
||||||
|
@ -1315,6 +1317,8 @@ void block_cache::insert_blocks(cached_piece_entry* pe, int block, span<file::io
|
||||||
}
|
}
|
||||||
|
|
||||||
TORRENT_ASSERT(pe->blocks[block].buf != nullptr);
|
TORRENT_ASSERT(pe->blocks[block].buf != nullptr);
|
||||||
|
|
||||||
|
block++;
|
||||||
}
|
}
|
||||||
|
|
||||||
TORRENT_PIECE_ASSERT(pe->cache_state != cached_piece_entry::read_lru1_ghost, pe);
|
TORRENT_PIECE_ASSERT(pe->cache_state != cached_piece_entry::read_lru1_ghost, pe);
|
||||||
|
|
|
@ -1647,7 +1647,7 @@ namespace libtorrent
|
||||||
|
|
||||||
TORRENT_ASSERT(ptr <= buf + sizeof(buf));
|
TORRENT_ASSERT(ptr <= buf + sizeof(buf));
|
||||||
|
|
||||||
send_buffer(buf, ptr - buf);
|
send_buffer(buf, int(ptr - buf));
|
||||||
|
|
||||||
stats_counters().inc_stats_counter(counters::num_outgoing_extended);
|
stats_counters().inc_stats_counter(counters::num_outgoing_extended);
|
||||||
}
|
}
|
||||||
|
@ -1840,7 +1840,7 @@ namespace libtorrent
|
||||||
// there should be a version too
|
// there should be a version too
|
||||||
// but where do we put that info?
|
// but where do we put that info?
|
||||||
|
|
||||||
int const last_seen_complete = root.dict_find_int_value("complete_ago", -1);
|
int const last_seen_complete = int(root.dict_find_int_value("complete_ago", -1));
|
||||||
if (last_seen_complete >= 0) set_last_seen_complete(last_seen_complete);
|
if (last_seen_complete >= 0) set_last_seen_complete(last_seen_complete);
|
||||||
|
|
||||||
auto client_info = root.dict_find_string_value("v");
|
auto client_info = root.dict_find_string_value("v");
|
||||||
|
@ -2204,7 +2204,7 @@ namespace libtorrent
|
||||||
#endif
|
#endif
|
||||||
m_sent_bitfield = true;
|
m_sent_bitfield = true;
|
||||||
|
|
||||||
send_buffer(reinterpret_cast<char const*>(msg.data()), msg.size());
|
send_buffer(reinterpret_cast<char const*>(msg.data()), int(msg.size()));
|
||||||
|
|
||||||
stats_counters().inc_stats_counter(counters::num_outgoing_bitfield);
|
stats_counters().inc_stats_counter(counters::num_outgoing_bitfield);
|
||||||
}
|
}
|
||||||
|
@ -2900,7 +2900,7 @@ namespace libtorrent
|
||||||
|
|
||||||
// TODO: 3 this is weird buffer handling
|
// TODO: 3 this is weird buffer handling
|
||||||
span<char> const buf = m_recv_buffer.mutable_buffer();
|
span<char> const buf = m_recv_buffer.mutable_buffer();
|
||||||
TORRENT_ASSERT(buf.size() >= m_recv_buffer.packet_size());
|
TORRENT_ASSERT(int(buf.size()) >= m_recv_buffer.packet_size());
|
||||||
rc4_decrypt({buf.data(), size_t(m_recv_buffer.packet_size())});
|
rc4_decrypt({buf.data(), size_t(m_recv_buffer.packet_size())});
|
||||||
|
|
||||||
recv_buffer = m_recv_buffer.get();
|
recv_buffer = m_recv_buffer.get();
|
||||||
|
@ -3007,7 +3007,7 @@ namespace libtorrent
|
||||||
|
|
||||||
// TODO: 3 this is weird buffer handling
|
// TODO: 3 this is weird buffer handling
|
||||||
span<char> const buf = m_recv_buffer.mutable_buffer();
|
span<char> const buf = m_recv_buffer.mutable_buffer();
|
||||||
TORRENT_ASSERT(buf.size() >= m_recv_buffer.packet_size());
|
TORRENT_ASSERT(int(buf.size()) >= m_recv_buffer.packet_size());
|
||||||
rc4_decrypt({buf.data(), size_t(m_recv_buffer.packet_size())});
|
rc4_decrypt({buf.data(), size_t(m_recv_buffer.packet_size())});
|
||||||
|
|
||||||
recv_buffer = m_recv_buffer.get();
|
recv_buffer = m_recv_buffer.get();
|
||||||
|
@ -3068,7 +3068,7 @@ namespace libtorrent
|
||||||
// ia is always rc4, so decrypt it
|
// ia is always rc4, so decrypt it
|
||||||
// TODO: 3 this is weird buffer handling
|
// TODO: 3 this is weird buffer handling
|
||||||
span<char> const buf = m_recv_buffer.mutable_buffer();
|
span<char> const buf = m_recv_buffer.mutable_buffer();
|
||||||
TORRENT_ASSERT(buf.size() >= m_recv_buffer.packet_size());
|
TORRENT_ASSERT(int(buf.size()) >= m_recv_buffer.packet_size());
|
||||||
rc4_decrypt({buf.data(), size_t(m_recv_buffer.packet_size())});
|
rc4_decrypt({buf.data(), size_t(m_recv_buffer.packet_size())});
|
||||||
|
|
||||||
#ifndef TORRENT_DISABLE_LOGGING
|
#ifndef TORRENT_DISABLE_LOGGING
|
||||||
|
|
|
@ -119,17 +119,17 @@ namespace libtorrent
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
std::uint32_t disk_buffer_pool::num_to_evict(int num_needed)
|
int disk_buffer_pool::num_to_evict(int const num_needed)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
std::unique_lock<std::mutex> l(m_pool_mutex);
|
std::unique_lock<std::mutex> l(m_pool_mutex);
|
||||||
|
|
||||||
if (m_exceeded_max_size)
|
if (m_exceeded_max_size)
|
||||||
ret = m_in_use - (std::min)(m_low_watermark, int(m_max_use - m_observers.size()*2));
|
ret = m_in_use - std::min(m_low_watermark, int(m_max_use - m_observers.size() * 2));
|
||||||
|
|
||||||
if (m_in_use + num_needed > m_max_use)
|
if (m_in_use + num_needed > m_max_use)
|
||||||
ret = (std::max)(ret, int(m_in_use + num_needed - m_max_use));
|
ret = std::max(ret, m_in_use + num_needed - m_max_use);
|
||||||
|
|
||||||
if (ret < 0) ret = 0;
|
if (ret < 0) ret = 0;
|
||||||
else if (ret > m_in_use) ret = m_in_use;
|
else if (ret > m_in_use) ret = m_in_use;
|
||||||
|
@ -271,14 +271,14 @@ namespace libtorrent
|
||||||
#if TORRENT_HAVE_MMAP && !defined TORRENT_NO_DEPRECATE
|
#if TORRENT_HAVE_MMAP && !defined TORRENT_NO_DEPRECATE
|
||||||
if (m_cache_pool)
|
if (m_cache_pool)
|
||||||
{
|
{
|
||||||
if (m_free_list.size() <= (m_max_use - m_low_watermark)
|
if (int(m_free_list.size()) <= (m_max_use - m_low_watermark)
|
||||||
/ 2 && !m_exceeded_max_size)
|
/ 2 && !m_exceeded_max_size)
|
||||||
{
|
{
|
||||||
m_exceeded_max_size = true;
|
m_exceeded_max_size = true;
|
||||||
m_trigger_cache_trim();
|
m_trigger_cache_trim();
|
||||||
}
|
}
|
||||||
if (m_free_list.empty()) return nullptr;
|
if (m_free_list.empty()) return nullptr;
|
||||||
std::uint64_t slot_index = m_free_list.back();
|
std::int64_t const slot_index = m_free_list.back();
|
||||||
m_free_list.pop_back();
|
m_free_list.pop_back();
|
||||||
ret = m_cache_pool + (slot_index * 0x4000);
|
ret = m_cache_pool + (slot_index * 0x4000);
|
||||||
TORRENT_ASSERT(is_disk_buffer(ret, l));
|
TORRENT_ASSERT(is_disk_buffer(ret, l));
|
||||||
|
@ -298,7 +298,7 @@ namespace libtorrent
|
||||||
? 20 // use small increments once we've exceeded the cache size
|
? 20 // use small increments once we've exceeded the cache size
|
||||||
: m_cache_buffer_chunk_size
|
: m_cache_buffer_chunk_size
|
||||||
? m_cache_buffer_chunk_size
|
? m_cache_buffer_chunk_size
|
||||||
: (std::max)(m_max_use / 10, 1);
|
: std::max(m_max_use / 10, 1);
|
||||||
m_pool.set_next_size(effective_block_size);
|
m_pool.set_next_size(effective_block_size);
|
||||||
ret = static_cast<char*>(m_pool.malloc());
|
ret = static_cast<char*>(m_pool.malloc());
|
||||||
}
|
}
|
||||||
|
@ -418,7 +418,7 @@ namespace libtorrent
|
||||||
// a 20th of everything exceeding 1 GiB
|
// a 20th of everything exceeding 1 GiB
|
||||||
// and a 10th of everything below a GiB
|
// and a 10th of everything below a GiB
|
||||||
|
|
||||||
std::int64_t const gb = 1024 * 1024 * 1024;
|
constexpr std::int64_t gb = 1024 * 1024 * 1024;
|
||||||
|
|
||||||
std::int64_t result = 0;
|
std::int64_t result = 0;
|
||||||
if (phys_ram > 4 * gb)
|
if (phys_ram > 4 * gb)
|
||||||
|
@ -447,7 +447,7 @@ namespace libtorrent
|
||||||
// 32 bit builds should capped below 2 GB of memory, even
|
// 32 bit builds should capped below 2 GB of memory, even
|
||||||
// when more actual ram is available, because we're still
|
// when more actual ram is available, because we're still
|
||||||
// constrained by the 32 bit virtual address space.
|
// constrained by the 32 bit virtual address space.
|
||||||
m_max_use = (std::min)(2 * 1024 * 1024 * 3 / 4 * 1024
|
m_max_use = std::min(2 * 1024 * 1024 * 3 / 4 * 1024
|
||||||
/ m_block_size, m_max_use);
|
/ m_block_size, m_max_use);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -455,7 +455,7 @@ namespace libtorrent
|
||||||
{
|
{
|
||||||
m_max_use = cache_size;
|
m_max_use = cache_size;
|
||||||
}
|
}
|
||||||
m_low_watermark = m_max_use - (std::max)(16, sett.get_int(settings_pack::max_queued_disk_bytes) / 0x4000);
|
m_low_watermark = m_max_use - std::max(16, sett.get_int(settings_pack::max_queued_disk_bytes) / 0x4000);
|
||||||
if (m_low_watermark < 0) m_low_watermark = 0;
|
if (m_low_watermark < 0) m_low_watermark = 0;
|
||||||
if (m_in_use >= m_max_use && !m_exceeded_max_size)
|
if (m_in_use >= m_max_use && !m_exceeded_max_size)
|
||||||
{
|
{
|
||||||
|
@ -483,7 +483,8 @@ namespace libtorrent
|
||||||
TORRENT_UNUSED(best_effort);
|
TORRENT_UNUSED(best_effort);
|
||||||
close(m_cache_fd);
|
close(m_cache_fd);
|
||||||
m_cache_fd = -1;
|
m_cache_fd = -1;
|
||||||
std::vector<int>().swap(m_free_list);
|
m_free_list.clear();
|
||||||
|
m_free_list.shrink_to_fit();
|
||||||
}
|
}
|
||||||
else if (m_cache_pool == nullptr && !sett.get_str(settings_pack::mmap_cache).empty())
|
else if (m_cache_pool == nullptr && !sett.get_str(settings_pack::mmap_cache).empty())
|
||||||
{
|
{
|
||||||
|
@ -528,7 +529,7 @@ namespace libtorrent
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT((size_t(m_cache_pool) & 0xfff) == 0);
|
TORRENT_ASSERT((std::size_t(m_cache_pool) & 0xfff) == 0);
|
||||||
m_free_list.reserve(m_max_use);
|
m_free_list.reserve(m_max_use);
|
||||||
for (int i = 0; i < m_max_use; ++i)
|
for (int i = 0; i < m_max_use; ++i)
|
||||||
m_free_list.push_back(i);
|
m_free_list.push_back(i);
|
||||||
|
@ -614,4 +615,3 @@ namespace libtorrent
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2320,7 +2320,7 @@ namespace libtorrent
|
||||||
// treat a short read as an error. The hash will be invalid, the
|
// treat a short read as an error. The hash will be invalid, the
|
||||||
// block cannot be cached and the main thread should skip the rest
|
// block cannot be cached and the main thread should skip the rest
|
||||||
// of this file
|
// of this file
|
||||||
if (read_ret != iov.iov_len)
|
if (read_ret != int(iov.iov_len))
|
||||||
{
|
{
|
||||||
ret = status_t::fatal_disk_error;
|
ret = status_t::fatal_disk_error;
|
||||||
j->error.ec = boost::asio::error::eof;
|
j->error.ec = boost::asio::error::eof;
|
||||||
|
|
|
@ -63,7 +63,7 @@ namespace libtorrent
|
||||||
std::lock_guard<std::mutex> l(m_mutex);
|
std::lock_guard<std::mutex> l(m_mutex);
|
||||||
if (i == m_max_threads) return;
|
if (i == m_max_threads) return;
|
||||||
m_max_threads = i;
|
m_max_threads = i;
|
||||||
if (m_threads.size() < i) return;
|
if (int(m_threads.size()) < i) return;
|
||||||
stop_threads(int(m_threads.size()) - i);
|
stop_threads(int(m_threads.size()) - i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -309,7 +309,7 @@ namespace libtorrent
|
||||||
}
|
}
|
||||||
|
|
||||||
// write pad
|
// write pad
|
||||||
for (int j = 0; j < inbuf.size() - available_input; ++j)
|
for (int j = 0; j < int(inbuf.size()) - available_input; ++j)
|
||||||
{
|
{
|
||||||
ret += '=';
|
ret += '=';
|
||||||
}
|
}
|
||||||
|
@ -372,7 +372,7 @@ namespace libtorrent
|
||||||
if (0 == (flags & string::no_padding))
|
if (0 == (flags & string::no_padding))
|
||||||
{
|
{
|
||||||
// write pad
|
// write pad
|
||||||
for (int j = 0; j < outbuf.size() - num_out; ++j)
|
for (int j = 0; j < int(outbuf.size()) - num_out; ++j)
|
||||||
{
|
{
|
||||||
ret += '=';
|
ret += '=';
|
||||||
}
|
}
|
||||||
|
|
|
@ -1365,10 +1365,10 @@ namespace libtorrent
|
||||||
std::uint32_t silly_hash(std::string const& str)
|
std::uint32_t silly_hash(std::string const& str)
|
||||||
{
|
{
|
||||||
std::uint32_t ret = 1;
|
std::uint32_t ret = 1;
|
||||||
for (int i = 0; i < str.size(); ++i)
|
for (auto const ch : str)
|
||||||
{
|
{
|
||||||
if (str[i] == 0) continue;
|
if (ch == 0) continue;
|
||||||
ret *= int(str[i]);
|
ret *= std::uint32_t(ch);
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -130,7 +130,7 @@ namespace libtorrent
|
||||||
branch_len = leaf - path.c_str();
|
branch_len = leaf - path.c_str();
|
||||||
|
|
||||||
// trim trailing slashes
|
// trim trailing slashes
|
||||||
if (branch_len > 0 && branch_path[branch_len-1] == TORRENT_SEPARATOR)
|
if (branch_len > 0 && branch_path[branch_len - 1] == TORRENT_SEPARATOR)
|
||||||
--branch_len;
|
--branch_len;
|
||||||
}
|
}
|
||||||
if (branch_len <= 0)
|
if (branch_len <= 0)
|
||||||
|
@ -140,12 +140,12 @@ namespace libtorrent
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (branch_len >= m_name.size()
|
if (branch_len >= int(m_name.size())
|
||||||
&& std::memcmp(branch_path, m_name.c_str(), m_name.size()) == 0)
|
&& std::memcmp(branch_path, m_name.c_str(), m_name.size()) == 0)
|
||||||
{
|
{
|
||||||
// the +1 is to skip the trailing '/' (or '\')
|
// the +1 is to skip the trailing '/' (or '\')
|
||||||
int const offset = int(m_name.size())
|
int const offset = int(m_name.size())
|
||||||
+ (m_name.size() == branch_len ? 0 : 1);
|
+ (int(m_name.size()) == branch_len ? 0 : 1);
|
||||||
branch_path += offset;
|
branch_path += offset;
|
||||||
branch_len -= offset;
|
branch_len -= offset;
|
||||||
e.no_root_dir = false;
|
e.no_root_dir = false;
|
||||||
|
@ -159,7 +159,7 @@ namespace libtorrent
|
||||||
auto p = std::find_if(m_paths.rbegin(), m_paths.rend()
|
auto p = std::find_if(m_paths.rbegin(), m_paths.rend()
|
||||||
, [&] (std::string const& str)
|
, [&] (std::string const& str)
|
||||||
{
|
{
|
||||||
if (str.size() != branch_len) return false;
|
if (int(str.size()) != branch_len) return false;
|
||||||
return std::memcmp(str.c_str(), branch_path, branch_len) == 0;
|
return std::memcmp(str.c_str(), branch_path, branch_len) == 0;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -323,16 +323,16 @@ namespace libtorrent
|
||||||
|
|
||||||
void file_storage::apply_pointer_offset(ptrdiff_t const off)
|
void file_storage::apply_pointer_offset(ptrdiff_t const off)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < m_files.size(); ++i)
|
for (auto& f : m_files)
|
||||||
{
|
{
|
||||||
if (m_files[i].name_len == internal_file_entry::name_is_owned) continue;
|
if (f.name_len == internal_file_entry::name_is_owned) continue;
|
||||||
m_files[i].name += off;
|
f.name += off;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < m_file_hashes.size(); ++i)
|
for (auto& h : m_file_hashes)
|
||||||
{
|
{
|
||||||
if (m_file_hashes[i] == nullptr) continue;
|
if (h == nullptr) continue;
|
||||||
m_file_hashes[i] += off;
|
h += off;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1139,12 +1139,12 @@ namespace libtorrent
|
||||||
return std::make_tuple(begin_piece, end_piece);
|
return std::make_tuple(begin_piece, end_piece);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::tuple<int, int> file_piece_range_inclusive(file_storage const& fs, int file)
|
std::tuple<int, int> file_piece_range_inclusive(file_storage const& fs, int const file)
|
||||||
{
|
{
|
||||||
peer_request const range = fs.map_file(file, 0, 1);
|
peer_request const range = fs.map_file(file, 0, 1);
|
||||||
std::int64_t const file_size = fs.file_size(file);
|
std::int64_t const file_size = fs.file_size(file);
|
||||||
std::int64_t const piece_size = fs.piece_length();
|
std::int64_t const piece_size = fs.piece_length();
|
||||||
int const end_piece = (range.piece * piece_size + range.start + file_size - 1) / piece_size + 1;
|
int const end_piece = int((range.piece * piece_size + range.start + file_size - 1) / piece_size + 1);
|
||||||
return std::make_tuple(range.piece, end_piece);
|
return std::make_tuple(range.piece, end_piece);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -430,7 +430,7 @@ void http_connection::on_timeout(std::weak_ptr<http_connection> p
|
||||||
// the connection timed out. If we have more endpoints to try, just
|
// the connection timed out. If we have more endpoints to try, just
|
||||||
// close this connection. The on_connect handler will try the next
|
// close this connection. The on_connect handler will try the next
|
||||||
// endpoint in the list.
|
// endpoint in the list.
|
||||||
if (c->m_next_ep < c->m_endpoints.size())
|
if (c->m_next_ep < int(c->m_endpoints.size()))
|
||||||
{
|
{
|
||||||
error_code ec;
|
error_code ec;
|
||||||
c->m_sock.close(ec);
|
c->m_sock.close(ec);
|
||||||
|
@ -544,7 +544,7 @@ void http_connection::on_resolve(error_code const& e
|
||||||
|
|
||||||
void http_connection::connect()
|
void http_connection::connect()
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(m_next_ep < m_endpoints.size());
|
TORRENT_ASSERT(m_next_ep < int(m_endpoints.size()));
|
||||||
|
|
||||||
std::shared_ptr<http_connection> me(shared_from_this());
|
std::shared_ptr<http_connection> me(shared_from_this());
|
||||||
|
|
||||||
|
@ -581,8 +581,8 @@ void http_connection::connect()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TORRENT_ASSERT(m_next_ep < m_endpoints.size());
|
TORRENT_ASSERT(m_next_ep < int(m_endpoints.size()));
|
||||||
if (m_next_ep >= m_endpoints.size()) return;
|
if (m_next_ep >= int(m_endpoints.size())) return;
|
||||||
|
|
||||||
tcp::endpoint target_address = m_endpoints[m_next_ep];
|
tcp::endpoint target_address = m_endpoints[m_next_ep];
|
||||||
++m_next_ep;
|
++m_next_ep;
|
||||||
|
@ -609,7 +609,7 @@ void http_connection::on_connect(error_code const& e)
|
||||||
async_write(m_sock, boost::asio::buffer(m_sendbuffer)
|
async_write(m_sock, boost::asio::buffer(m_sendbuffer)
|
||||||
, std::bind(&http_connection::on_write, shared_from_this(), _1));
|
, std::bind(&http_connection::on_write, shared_from_this(), _1));
|
||||||
}
|
}
|
||||||
else if (m_next_ep < m_endpoints.size() && !m_abort)
|
else if (m_next_ep < int(m_endpoints.size()) && !m_abort)
|
||||||
{
|
{
|
||||||
// The connection failed. Try the next endpoint in the list.
|
// The connection failed. Try the next endpoint in the list.
|
||||||
error_code ec;
|
error_code ec;
|
||||||
|
|
|
@ -321,7 +321,7 @@ restart_response:
|
||||||
m_chunked_encoding = string_begins_no_case("chunked", value.c_str());
|
m_chunked_encoding = string_begins_no_case("chunked", value.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
TORRENT_ASSERT(m_recv_pos <= recv_buffer.size());
|
TORRENT_ASSERT(m_recv_pos <= int(recv_buffer.size()));
|
||||||
TORRENT_ASSERT(pos <= recv_buffer.end());
|
TORRENT_ASSERT(pos <= recv_buffer.end());
|
||||||
newline = std::find(pos, recv_buffer.end(), '\n');
|
newline = std::find(pos, recv_buffer.end(), '\n');
|
||||||
}
|
}
|
||||||
|
|
|
@ -384,7 +384,7 @@ namespace libtorrent
|
||||||
|
|
||||||
received_bytes(0, header_size - m_partial_chunk_header);
|
received_bytes(0, header_size - m_partial_chunk_header);
|
||||||
m_partial_chunk_header = 0;
|
m_partial_chunk_header = 0;
|
||||||
TORRENT_ASSERT(chunk_size != 0 || chunk_start.size() <= header_size || chunk_start[header_size] == 'H');
|
TORRENT_ASSERT(chunk_size != 0 || int(chunk_start.size()) <= header_size || chunk_start[header_size] == 'H');
|
||||||
// cut out the chunk header from the receive buffer
|
// cut out the chunk header from the receive buffer
|
||||||
TORRENT_ASSERT(m_chunk_pos + m_body_start < INT_MAX);
|
TORRENT_ASSERT(m_chunk_pos + m_body_start < INT_MAX);
|
||||||
m_recv_buffer.cut(header_size, t->block_size() + 1024, int(m_chunk_pos + m_body_start));
|
m_recv_buffer.cut(header_size, t->block_size() + 1024, int(m_chunk_pos + m_body_start));
|
||||||
|
|
|
@ -113,7 +113,7 @@ namespace
|
||||||
item.value.reset(new char[size]);
|
item.value.reset(new char[size]);
|
||||||
item.size = size;
|
item.size = size;
|
||||||
}
|
}
|
||||||
std::memcpy(item.value.get(), buf.data(), size);
|
std::memcpy(item.value.get(), buf.data(), buf.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
void touch_item(dht_immutable_item& f, address const& addr)
|
void touch_item(dht_immutable_item& f, address const& addr)
|
||||||
|
|
|
@ -36,6 +36,7 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include <cinttypes> // for PRId64 et.al.
|
#include <cinttypes> // for PRId64 et.al.
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <tuple>
|
#include <tuple>
|
||||||
|
#include <array>
|
||||||
|
|
||||||
#ifndef TORRENT_DISABLE_LOGGING
|
#ifndef TORRENT_DISABLE_LOGGING
|
||||||
#include "libtorrent/hex.hpp" // to_hex
|
#include "libtorrent/hex.hpp" // to_hex
|
||||||
|
@ -1062,7 +1063,7 @@ void node::incoming_request(msg const& m, entry& e)
|
||||||
// number matches the expected value before replacing it
|
// number matches the expected value before replacing it
|
||||||
// this is critical for avoiding race conditions when multiple
|
// this is critical for avoiding race conditions when multiple
|
||||||
// writers are accessing the same slot
|
// writers are accessing the same slot
|
||||||
if (msg_keys[5] && item_seq.value != std::uint64_t(msg_keys[5].int_value()))
|
if (msg_keys[5] && item_seq.value != msg_keys[5].int_value())
|
||||||
{
|
{
|
||||||
m_counters.inc_stats_counter(counters::dht_invalid_put);
|
m_counters.inc_stats_counter(counters::dht_invalid_put);
|
||||||
incoming_error(e, "CAS mismatch", 301);
|
incoming_error(e, "CAS mismatch", 301);
|
||||||
|
@ -1188,14 +1189,16 @@ void node::write_nodes_entries(sha1_hash const& info_hash
|
||||||
|
|
||||||
node::protocol_descriptor const& node::map_protocol_to_descriptor(udp protocol)
|
node::protocol_descriptor const& node::map_protocol_to_descriptor(udp protocol)
|
||||||
{
|
{
|
||||||
static protocol_descriptor descriptors[] =
|
static std::array<protocol_descriptor, 2> descriptors =
|
||||||
{ {udp::v4(), "n4", "nodes"}
|
{{
|
||||||
, {udp::v6(), "n6", "nodes6"} };
|
{udp::v4(), "n4", "nodes"},
|
||||||
|
{udp::v6(), "n6", "nodes6"}
|
||||||
|
}};
|
||||||
|
|
||||||
for (int i = 0; i < sizeof(descriptors) / sizeof(protocol_descriptor); ++i)
|
for (auto const& d : descriptors)
|
||||||
{
|
{
|
||||||
if (descriptors[i].protocol == protocol)
|
if (d.protocol == protocol)
|
||||||
return descriptors[i];
|
return d;
|
||||||
}
|
}
|
||||||
|
|
||||||
TORRENT_ASSERT_FAIL();
|
TORRENT_ASSERT_FAIL();
|
||||||
|
|
|
@ -98,7 +98,7 @@ node_id generate_id_impl(address const& ip_, std::uint32_t r)
|
||||||
if (ip_.is_v6())
|
if (ip_.is_v6())
|
||||||
{
|
{
|
||||||
b6 = ip_.to_v6().to_bytes();
|
b6 = ip_.to_v6().to_bytes();
|
||||||
ip = &b6[0];
|
ip = b6.data();
|
||||||
num_octets = 8;
|
num_octets = 8;
|
||||||
mask = v6mask;
|
mask = v6mask;
|
||||||
}
|
}
|
||||||
|
@ -106,7 +106,7 @@ node_id generate_id_impl(address const& ip_, std::uint32_t r)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
b4 = ip_.to_v4().to_bytes();
|
b4 = ip_.to_v4().to_bytes();
|
||||||
ip = &b4[0];
|
ip = b4.data();
|
||||||
num_octets = 4;
|
num_octets = 4;
|
||||||
mask = v4mask;
|
mask = v4mask;
|
||||||
}
|
}
|
||||||
|
@ -133,7 +133,7 @@ node_id generate_id_impl(address const& ip_, std::uint32_t r)
|
||||||
id[1] = (c >> 16) & 0xff;
|
id[1] = (c >> 16) & 0xff;
|
||||||
id[2] = (((c >> 8) & 0xf8) | random(0x7)) & 0xff;
|
id[2] = (((c >> 8) & 0xf8) | random(0x7)) & 0xff;
|
||||||
|
|
||||||
for (int i = 3; i < 19; ++i) id[i] = std::uint8_t(random(0xff));
|
for (std::size_t i = 3; i < 19; ++i) id[i] = random(0xff) & 0xff;
|
||||||
id[19] = r & 0xff;
|
id[19] = r & 0xff;
|
||||||
|
|
||||||
return id;
|
return id;
|
||||||
|
@ -204,13 +204,13 @@ bool matching_prefix(node_id const& nid, int mask, int prefix, int offset)
|
||||||
return (id[0] & mask) == prefix;
|
return (id[0] & mask) == prefix;
|
||||||
}
|
}
|
||||||
|
|
||||||
node_id generate_prefix_mask(int bits)
|
node_id generate_prefix_mask(int const bits)
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(bits >= 0);
|
TORRENT_ASSERT(bits >= 0);
|
||||||
TORRENT_ASSERT(bits <= 160);
|
TORRENT_ASSERT(bits <= 160);
|
||||||
node_id mask(nullptr);
|
node_id mask;
|
||||||
int b = 0;
|
std::size_t b = 0;
|
||||||
for (; b < bits - 7; b += 8) mask[b / 8] |= 0xff;
|
for (; int(b) < bits - 7; b += 8) mask[b / 8] |= 0xff;
|
||||||
if (bits < 160) mask[b / 8] |= (0xff << (8 - (bits & 7))) & 0xff;
|
if (bits < 160) mask[b / 8] |= (0xff << (8 - (bits & 7))) & 0xff;
|
||||||
return mask;
|
return mask;
|
||||||
}
|
}
|
||||||
|
|
|
@ -960,24 +960,14 @@ void routing_table::update_node_id(node_id const& id)
|
||||||
|
|
||||||
// then add them all back. First add the main nodes, then the replacement
|
// then add them all back. First add the main nodes, then the replacement
|
||||||
// nodes
|
// nodes
|
||||||
for (int i = 0; i < old_buckets.size(); ++i)
|
for (auto const& b : old_buckets)
|
||||||
{
|
for (auto const& n : b.live_nodes)
|
||||||
bucket_t const& bucket = old_buckets[i].live_nodes;
|
add_node(n);
|
||||||
for (int j = 0; j < bucket.size(); ++j)
|
|
||||||
{
|
|
||||||
add_node(bucket[j]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// now add back the replacement nodes
|
// now add back the replacement nodes
|
||||||
for (int i = 0; i < old_buckets.size(); ++i)
|
for (auto const& b : old_buckets)
|
||||||
{
|
for (auto const& n : b.replacements)
|
||||||
bucket_t const& bucket = old_buckets[i].replacements;
|
add_node(n);
|
||||||
for (int j = 0; j < bucket.size(); ++j)
|
|
||||||
{
|
|
||||||
add_node(bucket[j]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void routing_table::for_each_node(
|
void routing_table::for_each_node(
|
||||||
|
|
|
@ -450,7 +450,7 @@ bool rpc_manager::invoke(entry& e, udp::endpoint const& target_addr
|
||||||
std::string transaction_id;
|
std::string transaction_id;
|
||||||
transaction_id.resize(2);
|
transaction_id.resize(2);
|
||||||
char* out = &transaction_id[0];
|
char* out = &transaction_id[0];
|
||||||
std::uint16_t tid = std::uint16_t(random(0x7fff));
|
std::uint16_t const tid = std::uint16_t(random(0x7fff));
|
||||||
detail::write_uint16(tid, out);
|
detail::write_uint16(tid, out);
|
||||||
e["t"] = transaction_id;
|
e["t"] = transaction_id;
|
||||||
|
|
||||||
|
|
|
@ -207,22 +207,23 @@ void traversal_algorithm::add_entry(node_id const& id
|
||||||
|
|
||||||
if (m_results.size() > 100)
|
if (m_results.size() > 100)
|
||||||
{
|
{
|
||||||
for (int i = 100; i < int(m_results.size()); ++i)
|
std::for_each(m_results.begin() + 100, m_results.end()
|
||||||
|
, [this](std::shared_ptr<observer> const& ptr)
|
||||||
{
|
{
|
||||||
if ((m_results[i]->flags & (observer::flag_queried | observer::flag_failed | observer::flag_alive))
|
if ((ptr->flags & (observer::flag_queried | observer::flag_failed | observer::flag_alive))
|
||||||
== observer::flag_queried)
|
== observer::flag_queried)
|
||||||
{
|
{
|
||||||
// set the done flag on any outstanding queries to prevent them from
|
// set the done flag on any outstanding queries to prevent them from
|
||||||
// calling finished() or failed()
|
// calling finished() or failed()
|
||||||
m_results[i]->flags |= observer::flag_done;
|
ptr->flags |= observer::flag_done;
|
||||||
TORRENT_ASSERT(m_invoke_count > 0);
|
TORRENT_ASSERT(m_invoke_count > 0);
|
||||||
--m_invoke_count;
|
--m_invoke_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if TORRENT_USE_ASSERTS
|
#if TORRENT_USE_ASSERTS
|
||||||
m_results[i]->m_was_abandoned = true;
|
ptr->m_was_abandoned = true;
|
||||||
#endif
|
#endif
|
||||||
}
|
});
|
||||||
m_results.resize(100);
|
m_results.resize(100);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -118,8 +118,9 @@ namespace libtorrent
|
||||||
|
|
||||||
for (int i = 0; i < num_pieces; ++i)
|
for (int i = 0; i < num_pieces; ++i)
|
||||||
{
|
{
|
||||||
int slot = read_uint32(ptr);
|
std::uint32_t const uslot = read_uint32(ptr);
|
||||||
if (slot == 0xffffffff) continue;
|
if (uslot == 0xffffffff) continue;
|
||||||
|
int const slot = int(uslot);
|
||||||
|
|
||||||
// invalid part-file
|
// invalid part-file
|
||||||
TORRENT_ASSERT(slot < num_pieces);
|
TORRENT_ASSERT(slot < num_pieces);
|
||||||
|
@ -331,8 +332,8 @@ namespace libtorrent
|
||||||
if (ec || v.iov_len == 0) return;
|
if (ec || v.iov_len == 0) return;
|
||||||
|
|
||||||
std::int64_t ret = f.writev(file_offset, v, ec);
|
std::int64_t ret = f.writev(file_offset, v, ec);
|
||||||
TORRENT_ASSERT(ec || ret == v.iov_len);
|
TORRENT_ASSERT(ec || ret == std::int64_t(v.iov_len));
|
||||||
if (ec || ret != v.iov_len) return;
|
if (ec || ret != std::int64_t(v.iov_len)) return;
|
||||||
|
|
||||||
// we're done with the disk I/O, grab the lock again to update
|
// we're done with the disk I/O, grab the lock again to update
|
||||||
// the slot map
|
// the slot map
|
||||||
|
|
|
@ -136,7 +136,7 @@ namespace libtorrent
|
||||||
bufs = abufs;
|
bufs = abufs;
|
||||||
need_destruct = true;
|
need_destruct = true;
|
||||||
size_t num_bufs = 0;
|
size_t num_bufs = 0;
|
||||||
for (int i = 0; to_process > 0 && i < iovec.size(); ++i)
|
for (std::size_t i = 0; to_process > 0 && i < iovec.size(); ++i)
|
||||||
{
|
{
|
||||||
++num_bufs;
|
++num_bufs;
|
||||||
int const size = int(iovec[i].size());
|
int const size = int(iovec[i].size());
|
||||||
|
@ -370,11 +370,11 @@ void rc4_init(const unsigned char* in, unsigned long len, rc4 *state)
|
||||||
keylen = state->x;
|
keylen = state->x;
|
||||||
|
|
||||||
/* make RC4 perm and shuffle */
|
/* make RC4 perm and shuffle */
|
||||||
for (x = 0; x < key_size; ++x) {
|
for (x = 0; x < int(key_size); ++x) {
|
||||||
s[x] = std::uint8_t(x);
|
s[x] = std::uint8_t(x);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (j = x = y = 0; x < key_size; x++) {
|
for (j = x = y = 0; x < int(key_size); x++) {
|
||||||
y = (y + state->buf[x] + key[j++]) & 255;
|
y = (y + state->buf[x] + key[j++]) & 255;
|
||||||
if (j == keylen) {
|
if (j == keylen) {
|
||||||
j = 0;
|
j = 0;
|
||||||
|
|
|
@ -40,7 +40,7 @@ namespace libtorrent
|
||||||
{
|
{
|
||||||
if (std::find(m_class.begin(), m_class.begin() + m_size, c)
|
if (std::find(m_class.begin(), m_class.begin() + m_size, c)
|
||||||
!= m_class.begin() + m_size) return;
|
!= m_class.begin() + m_size) return;
|
||||||
if (m_size >= m_class.size() - 1)
|
if (m_size >= int(m_class.size()) - 1)
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT_FAIL();
|
TORRENT_ASSERT_FAIL();
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -596,7 +596,7 @@ namespace libtorrent
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
char const* p = hash.data();
|
char const* p = hash.data();
|
||||||
for (int i = 0; i < hash.size() / sizeof(std::uint32_t); ++i)
|
for (int i = 0; i < int(hash.size() / sizeof(std::uint32_t)); ++i)
|
||||||
{
|
{
|
||||||
++loops;
|
++loops;
|
||||||
int const piece = detail::read_uint32(p) % num_pieces;
|
int const piece = detail::read_uint32(p) % num_pieces;
|
||||||
|
@ -2900,7 +2900,7 @@ namespace libtorrent
|
||||||
&& (bytes_left * 1000) / rate < m_settings.get_int(settings_pack::predictive_piece_announce))
|
&& (bytes_left * 1000) / rate < m_settings.get_int(settings_pack::predictive_piece_announce))
|
||||||
{
|
{
|
||||||
// we predict we will complete this piece very soon.
|
// we predict we will complete this piece very soon.
|
||||||
t->predicted_have_piece(piece, (bytes_left * 1000) / rate);
|
t->predicted_have_piece(piece, int((bytes_left * 1000) / rate));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3044,8 +3044,6 @@ namespace libtorrent
|
||||||
|
|
||||||
piece_picker& picker = t->picker();
|
piece_picker& picker = t->picker();
|
||||||
|
|
||||||
TORRENT_ASSERT(p.piece == p.piece);
|
|
||||||
TORRENT_ASSERT(p.start == p.start);
|
|
||||||
TORRENT_ASSERT(picker.num_peers(block_finished) == 0);
|
TORRENT_ASSERT(picker.num_peers(block_finished) == 0);
|
||||||
|
|
||||||
// std::fprintf(stderr, "peer_connection mark_as_finished peer: %p piece: %d block: %d\n"
|
// std::fprintf(stderr, "peer_connection mark_as_finished peer: %p piece: %d block: %d\n"
|
||||||
|
@ -3593,8 +3591,8 @@ namespace libtorrent
|
||||||
|
|
||||||
TORRENT_ASSERT(block.block_index != piece_block::invalid.block_index);
|
TORRENT_ASSERT(block.block_index != piece_block::invalid.block_index);
|
||||||
TORRENT_ASSERT(block.piece_index != piece_block::invalid.piece_index);
|
TORRENT_ASSERT(block.piece_index != piece_block::invalid.piece_index);
|
||||||
TORRENT_ASSERT(int(block.piece_index) < t->torrent_file().num_pieces());
|
TORRENT_ASSERT(block.piece_index < t->torrent_file().num_pieces());
|
||||||
TORRENT_ASSERT(int(block.block_index) < t->torrent_file().piece_size(block.piece_index));
|
TORRENT_ASSERT(block.block_index < t->torrent_file().piece_size(block.piece_index));
|
||||||
|
|
||||||
// if all the peers that requested this block has been
|
// if all the peers that requested this block has been
|
||||||
// cancelled, then just ignore the cancel.
|
// cancelled, then just ignore the cancel.
|
||||||
|
@ -3805,7 +3803,7 @@ namespace libtorrent
|
||||||
send_suggest(*i);
|
send_suggest(*i);
|
||||||
}
|
}
|
||||||
int const max = m_settings.get_int(settings_pack::max_suggest_pieces);
|
int const max = m_settings.get_int(settings_pack::max_suggest_pieces);
|
||||||
if (m_suggest_pieces.size() > max)
|
if (int(m_suggest_pieces.size()) > max)
|
||||||
{
|
{
|
||||||
int const to_erase = m_suggest_pieces.size() - max;
|
int const to_erase = m_suggest_pieces.size() - max;
|
||||||
m_suggest_pieces.erase(m_suggest_pieces.begin()
|
m_suggest_pieces.erase(m_suggest_pieces.begin()
|
||||||
|
@ -3884,7 +3882,7 @@ namespace libtorrent
|
||||||
}
|
}
|
||||||
|
|
||||||
int block_offset = block.block.block_index * t->block_size();
|
int block_offset = block.block.block_index * t->block_size();
|
||||||
int block_size = (std::min)(t->torrent_file().piece_size(
|
int block_size = std::min(t->torrent_file().piece_size(
|
||||||
block.block.piece_index) - block_offset, t->block_size());
|
block.block.piece_index) - block_offset, t->block_size());
|
||||||
TORRENT_ASSERT(block_size > 0);
|
TORRENT_ASSERT(block_size > 0);
|
||||||
TORRENT_ASSERT(block_size <= t->block_size());
|
TORRENT_ASSERT(block_size <= t->block_size());
|
||||||
|
@ -3937,7 +3935,7 @@ namespace libtorrent
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
block_offset = block.block.block_index * t->block_size();
|
block_offset = block.block.block_index * t->block_size();
|
||||||
block_size = (std::min)(t->torrent_file().piece_size(
|
block_size = std::min(t->torrent_file().piece_size(
|
||||||
block.block.piece_index) - block_offset, t->block_size());
|
block.block.piece_index) - block_offset, t->block_size());
|
||||||
TORRENT_ASSERT(block_size > 0);
|
TORRENT_ASSERT(block_size > 0);
|
||||||
TORRENT_ASSERT(block_size <= t->block_size());
|
TORRENT_ASSERT(block_size <= t->block_size());
|
||||||
|
@ -5064,7 +5062,7 @@ namespace libtorrent
|
||||||
// be blocked because we have to verify the hash first, so keep going with the
|
// be blocked because we have to verify the hash first, so keep going with the
|
||||||
// next request. However, only let each peer have one hash verification outstanding
|
// next request. However, only let each peer have one hash verification outstanding
|
||||||
// at any given time
|
// at any given time
|
||||||
for (int i = 0; i < m_requests.size()
|
for (int i = 0; i < int(m_requests.size())
|
||||||
&& (send_buffer_size() + m_reading_bytes < buffer_size_watermark); ++i)
|
&& (send_buffer_size() + m_reading_bytes < buffer_size_watermark); ++i)
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(t->ready_for_connections());
|
TORRENT_ASSERT(t->ready_for_connections());
|
||||||
|
@ -5828,12 +5826,12 @@ namespace libtorrent
|
||||||
// if we received exactly as many bytes as we provided a receive buffer
|
// if we received exactly as many bytes as we provided a receive buffer
|
||||||
// for. There most likely are more bytes to read, and we should grow our
|
// for. There most likely are more bytes to read, and we should grow our
|
||||||
// receive buffer.
|
// receive buffer.
|
||||||
TORRENT_ASSERT(bytes_transferred <= m_recv_buffer.max_receive());
|
TORRENT_ASSERT(int(bytes_transferred) <= m_recv_buffer.max_receive());
|
||||||
bool const grow_buffer = (bytes_transferred == m_recv_buffer.max_receive());
|
bool const grow_buffer = (int(bytes_transferred) == m_recv_buffer.max_receive());
|
||||||
account_received_bytes(bytes_transferred);
|
account_received_bytes(bytes_transferred);
|
||||||
|
|
||||||
if (m_extension_outstanding_bytes > 0)
|
if (m_extension_outstanding_bytes > 0)
|
||||||
m_extension_outstanding_bytes -= (std::min)(m_extension_outstanding_bytes, int(bytes_transferred));
|
m_extension_outstanding_bytes -= std::min(m_extension_outstanding_bytes, int(bytes_transferred));
|
||||||
|
|
||||||
check_graceful_pause();
|
check_graceful_pause();
|
||||||
if (m_disconnecting) return;
|
if (m_disconnecting) return;
|
||||||
|
@ -5843,7 +5841,7 @@ namespace libtorrent
|
||||||
if (grow_buffer)
|
if (grow_buffer)
|
||||||
{
|
{
|
||||||
error_code ec;
|
error_code ec;
|
||||||
std::size_t buffer_size = m_socket->available(ec);
|
int buffer_size = int(m_socket->available(ec));
|
||||||
if (ec)
|
if (ec)
|
||||||
{
|
{
|
||||||
disconnect(ec, op_available);
|
disconnect(ec, op_available);
|
||||||
|
@ -5852,7 +5850,7 @@ namespace libtorrent
|
||||||
|
|
||||||
#ifndef TORRENT_DISABLE_LOGGING
|
#ifndef TORRENT_DISABLE_LOGGING
|
||||||
peer_log(peer_log_alert::incoming, "AVAILABLE"
|
peer_log(peer_log_alert::incoming, "AVAILABLE"
|
||||||
, "%d bytes", int(buffer_size));
|
, "%d bytes", buffer_size);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
request_bandwidth(download_channel, buffer_size);
|
request_bandwidth(download_channel, buffer_size);
|
||||||
|
@ -5862,7 +5860,7 @@ namespace libtorrent
|
||||||
if (buffer_size > 0)
|
if (buffer_size > 0)
|
||||||
{
|
{
|
||||||
span<char> const vec = m_recv_buffer.reserve(buffer_size);
|
span<char> const vec = m_recv_buffer.reserve(buffer_size);
|
||||||
size_t bytes = m_socket->read_some(
|
std::size_t bytes = m_socket->read_some(
|
||||||
boost::asio::mutable_buffers_1(vec.data(), vec.size()), ec);
|
boost::asio::mutable_buffers_1(vec.data(), vec.size()), ec);
|
||||||
|
|
||||||
// this is weird. You would imagine read_some() would do this
|
// this is weird. You would imagine read_some() would do this
|
||||||
|
@ -5872,7 +5870,7 @@ namespace libtorrent
|
||||||
if (should_log(peer_log_alert::incoming))
|
if (should_log(peer_log_alert::incoming))
|
||||||
{
|
{
|
||||||
peer_log(peer_log_alert::incoming, "SYNC_READ", "max: %d ret: %d e: %s"
|
peer_log(peer_log_alert::incoming, "SYNC_READ", "max: %d ret: %d e: %s"
|
||||||
, int(buffer_size), int(bytes), ec ? ec.message().c_str() : "");
|
, buffer_size, int(bytes), ec ? ec.message().c_str() : "");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -40,8 +40,8 @@ namespace libtorrent {
|
||||||
counters::counters()
|
counters::counters()
|
||||||
{
|
{
|
||||||
#ifdef ATOMIC_LLONG_LOCK_FREE
|
#ifdef ATOMIC_LLONG_LOCK_FREE
|
||||||
for (int i = 0; i < m_stats_counter.size(); ++i)
|
for (auto& counter : m_stats_counter)
|
||||||
m_stats_counter[i].store(0, std::memory_order_relaxed);
|
counter.store(0, std::memory_order_relaxed);
|
||||||
#else
|
#else
|
||||||
std::memset(m_stats_counter, 0, sizeof(m_stats_counter));
|
std::memset(m_stats_counter, 0, sizeof(m_stats_counter));
|
||||||
#endif
|
#endif
|
||||||
|
@ -50,7 +50,7 @@ namespace libtorrent {
|
||||||
counters::counters(counters const& c)
|
counters::counters(counters const& c)
|
||||||
{
|
{
|
||||||
#ifdef ATOMIC_LLONG_LOCK_FREE
|
#ifdef ATOMIC_LLONG_LOCK_FREE
|
||||||
for (int i = 0; i < m_stats_counter.size(); ++i)
|
for (std::size_t i = 0; i < m_stats_counter.size(); ++i)
|
||||||
m_stats_counter[i].store(
|
m_stats_counter[i].store(
|
||||||
c.m_stats_counter[i].load(std::memory_order_relaxed)
|
c.m_stats_counter[i].load(std::memory_order_relaxed)
|
||||||
, std::memory_order_relaxed);
|
, std::memory_order_relaxed);
|
||||||
|
@ -63,7 +63,7 @@ namespace libtorrent {
|
||||||
counters& counters::operator=(counters const& c)
|
counters& counters::operator=(counters const& c)
|
||||||
{
|
{
|
||||||
#ifdef ATOMIC_LLONG_LOCK_FREE
|
#ifdef ATOMIC_LLONG_LOCK_FREE
|
||||||
for (int i = 0; i < m_stats_counter.size(); ++i)
|
for (std::size_t i = 0; i < m_stats_counter.size(); ++i)
|
||||||
m_stats_counter[i].store(
|
m_stats_counter[i].store(
|
||||||
c.m_stats_counter[i].load(std::memory_order_relaxed)
|
c.m_stats_counter[i].load(std::memory_order_relaxed)
|
||||||
, std::memory_order_relaxed);
|
, std::memory_order_relaxed);
|
||||||
|
|
|
@ -170,7 +170,8 @@ namespace libtorrent
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
piece_picker::dlpiece_iter piece_picker::add_download_piece(int piece)
|
std::vector<piece_picker::downloading_piece>::iterator
|
||||||
|
piece_picker::add_download_piece(int const piece)
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(piece >= 0);
|
TORRENT_ASSERT(piece >= 0);
|
||||||
TORRENT_ASSERT(piece < int(m_piece_map.size()));
|
TORRENT_ASSERT(piece < int(m_piece_map.size()));
|
||||||
|
@ -190,7 +191,7 @@ namespace libtorrent
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// there is already free space in m_block_info, grab one range
|
// there is already free space in m_block_info, grab one range
|
||||||
block_index = m_free_block_infos.back();
|
block_index = int(m_free_block_infos.back());
|
||||||
m_free_block_infos.pop_back();
|
m_free_block_infos.pop_back();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -249,7 +250,7 @@ namespace libtorrent
|
||||||
m_piece_map[i->index].download_state = piece_pos::piece_open;
|
m_piece_map[i->index].download_state = piece_pos::piece_open;
|
||||||
m_downloads[download_state].erase(i);
|
m_downloads[download_state].erase(i);
|
||||||
|
|
||||||
TORRENT_ASSERT(prev_size == m_downloads[download_state].size() + 1);
|
TORRENT_ASSERT(prev_size == int(m_downloads[download_state].size()) + 1);
|
||||||
|
|
||||||
#if TORRENT_USE_INVARIANT_CHECKS
|
#if TORRENT_USE_INVARIANT_CHECKS
|
||||||
check_piece_state();
|
check_piece_state();
|
||||||
|
@ -289,7 +290,7 @@ namespace libtorrent
|
||||||
downloading_piece const& dp)
|
downloading_piece const& dp)
|
||||||
{
|
{
|
||||||
int idx = int(dp.info_idx) * m_blocks_per_piece;
|
int idx = int(dp.info_idx) * m_blocks_per_piece;
|
||||||
TORRENT_ASSERT(idx + m_blocks_per_piece <= m_block_info.size());
|
TORRENT_ASSERT(idx + m_blocks_per_piece <= int(m_block_info.size()));
|
||||||
return &m_block_info[idx];
|
return &m_block_info[idx];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -334,7 +335,7 @@ namespace libtorrent
|
||||||
void piece_picker::verify_pick(std::vector<piece_block> const& picked
|
void piece_picker::verify_pick(std::vector<piece_block> const& picked
|
||||||
, bitfield const& bits) const
|
, bitfield const& bits) const
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(bits.size() == m_piece_map.size());
|
TORRENT_ASSERT(bits.size() == int(m_piece_map.size()));
|
||||||
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)
|
||||||
{
|
{
|
||||||
|
@ -412,8 +413,8 @@ namespace libtorrent
|
||||||
int num_pieces = have.size();
|
int num_pieces = have.size();
|
||||||
for (int i = 0; i < num_pieces; ++i)
|
for (int i = 0; i < num_pieces; ++i)
|
||||||
{
|
{
|
||||||
int h = have[i];
|
bool h = have[i];
|
||||||
TORRENT_ASSERT(m_piece_map[i].have_peers.count(p) == h);
|
TORRENT_ASSERT(m_piece_map[std::size_t(i)].have_peers.count(p) == (h ? 1 : 0));
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
TORRENT_UNUSED(have);
|
TORRENT_UNUSED(have);
|
||||||
|
@ -617,7 +618,7 @@ namespace libtorrent
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef TORRENT_DEBUG_REFCOUNTS
|
#ifdef TORRENT_DEBUG_REFCOUNTS
|
||||||
TORRENT_ASSERT(p.have_peers.size() == p.peer_count + m_seeds);
|
TORRENT_ASSERT(int(p.have_peers.size()) == p.peer_count + m_seeds);
|
||||||
#endif
|
#endif
|
||||||
if (p.index == piece_pos::we_have_index)
|
if (p.index == piece_pos::we_have_index)
|
||||||
++num_have;
|
++num_have;
|
||||||
|
@ -901,8 +902,8 @@ namespace libtorrent
|
||||||
// priority bucket. If it doesn't, it means this piece changed
|
// priority bucket. If it doesn't, it means this piece changed
|
||||||
// state without updating the corresponding entry in the pieces list
|
// state without updating the corresponding entry in the pieces list
|
||||||
TORRENT_ASSERT(m_priority_boundaries[priority] >= elem_index);
|
TORRENT_ASSERT(m_priority_boundaries[priority] >= elem_index);
|
||||||
TORRENT_ASSERT(priority == 0 || m_priority_boundaries[priority-1] <= elem_index);
|
TORRENT_ASSERT(priority == 0 || m_priority_boundaries[priority - 1] <= elem_index);
|
||||||
TORRENT_ASSERT(priority + 1 == m_priority_boundaries.size() || m_priority_boundaries[priority+1] > elem_index);
|
TORRENT_ASSERT(priority + 1 == int(m_priority_boundaries.size()) || m_priority_boundaries[priority + 1] > elem_index);
|
||||||
|
|
||||||
int index = m_pieces[elem_index];
|
int index = m_pieces[elem_index];
|
||||||
// update the piece_map
|
// update the piece_map
|
||||||
|
@ -1252,13 +1253,13 @@ namespace libtorrent
|
||||||
// nothing set, nothing to do here
|
// nothing set, nothing to do here
|
||||||
if (bitmask.none_set()) return;
|
if (bitmask.none_set()) return;
|
||||||
|
|
||||||
if (bitmask.all_set() && bitmask.size() == m_piece_map.size())
|
if (bitmask.all_set() && bitmask.size() == int(m_piece_map.size()))
|
||||||
{
|
{
|
||||||
inc_refcount_all(peer);
|
inc_refcount_all(peer);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const int size = (std::min)(50, int(bitmask.size()/2));
|
int const size = std::min(50, bitmask.size() / 2);
|
||||||
|
|
||||||
// this is an optimization where if just a few
|
// this is an optimization where if just a few
|
||||||
// pieces end up changing, instead of making
|
// pieces end up changing, instead of making
|
||||||
|
@ -1340,7 +1341,7 @@ namespace libtorrent
|
||||||
#ifdef TORRENT_EXPENSIVE_INVARIANT_CHECKS
|
#ifdef TORRENT_EXPENSIVE_INVARIANT_CHECKS
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
#endif
|
#endif
|
||||||
TORRENT_ASSERT(bitmask.size() <= m_piece_map.size());
|
TORRENT_ASSERT(bitmask.size() <= int(m_piece_map.size()));
|
||||||
|
|
||||||
#ifdef TORRENT_PICKER_LOG
|
#ifdef TORRENT_PICKER_LOG
|
||||||
std::cerr << "[" << this << "] " << "dec_refcount(bitfield)" << std::endl;
|
std::cerr << "[" << this << "] " << "dec_refcount(bitfield)" << std::endl;
|
||||||
|
@ -1349,13 +1350,13 @@ namespace libtorrent
|
||||||
// nothing set, nothing to do here
|
// nothing set, nothing to do here
|
||||||
if (bitmask.none_set()) return;
|
if (bitmask.none_set()) return;
|
||||||
|
|
||||||
if (bitmask.all_set() && bitmask.size() == m_piece_map.size())
|
if (bitmask.all_set() && bitmask.size() == int(m_piece_map.size()))
|
||||||
{
|
{
|
||||||
dec_refcount_all(peer);
|
dec_refcount_all(peer);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const int size = (std::min)(50, int(bitmask.size()/2));
|
int const size = std::min(50, bitmask.size() / 2);
|
||||||
|
|
||||||
// this is an optimization where if just a few
|
// this is an optimization where if just a few
|
||||||
// pieces end up changing, instead of making
|
// pieces end up changing, instead of making
|
||||||
|
@ -1521,16 +1522,18 @@ namespace libtorrent
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void piece_picker::piece_passed(int index)
|
void piece_picker::piece_passed(int const index)
|
||||||
{
|
{
|
||||||
piece_pos& p = m_piece_map[index];
|
TORRENT_ASSERT(index >= 0);
|
||||||
|
TORRENT_ASSERT(index < int(m_piece_map.size()));
|
||||||
|
piece_pos& p = m_piece_map[std::size_t(index)];
|
||||||
int download_state = p.download_queue();
|
int download_state = p.download_queue();
|
||||||
|
|
||||||
// this is kind of odd. Could this happen?
|
// this is kind of odd. Could this happen?
|
||||||
TORRENT_ASSERT(download_state != piece_pos::piece_open);
|
TORRENT_ASSERT(download_state != piece_pos::piece_open);
|
||||||
if (download_state == piece_pos::piece_open) return;
|
if (download_state == piece_pos::piece_open) return;
|
||||||
|
|
||||||
std::vector<downloading_piece>::iterator i = find_dl_piece(download_state, index);
|
auto const i = find_dl_piece(download_state, index);
|
||||||
TORRENT_ASSERT(i != m_downloads[download_state].end());
|
TORRENT_ASSERT(i != m_downloads[download_state].end());
|
||||||
|
|
||||||
TORRENT_ASSERT(i->locked == false);
|
TORRENT_ASSERT(i->locked == false);
|
||||||
|
@ -1545,13 +1548,13 @@ namespace libtorrent
|
||||||
we_have(index);
|
we_have(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
void piece_picker::we_dont_have(int index)
|
void piece_picker::we_dont_have(int const index)
|
||||||
{
|
{
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
TORRENT_ASSERT(index >= 0);
|
TORRENT_ASSERT(index >= 0);
|
||||||
TORRENT_ASSERT(index < int(m_piece_map.size()));
|
TORRENT_ASSERT(index < int(m_piece_map.size()));
|
||||||
|
|
||||||
piece_pos& p = m_piece_map[index];
|
piece_pos& p = m_piece_map[std::size_t(index)];
|
||||||
|
|
||||||
#ifdef TORRENT_PICKER_LOG
|
#ifdef TORRENT_PICKER_LOG
|
||||||
std::cerr << "[" << this << "] " << "piece_picker::we_dont_have("
|
std::cerr << "[" << this << "] " << "piece_picker::we_dont_have("
|
||||||
|
@ -1565,8 +1568,7 @@ namespace libtorrent
|
||||||
int download_state = p.download_queue();
|
int download_state = p.download_queue();
|
||||||
if (download_state == piece_pos::piece_open) return;
|
if (download_state == piece_pos::piece_open) return;
|
||||||
|
|
||||||
std::vector<downloading_piece>::iterator i
|
auto const i = find_dl_piece(download_state, index);
|
||||||
= find_dl_piece(download_state, index);
|
|
||||||
if (i->passed_hash_check)
|
if (i->passed_hash_check)
|
||||||
{
|
{
|
||||||
i->passed_hash_check = false;
|
i->passed_hash_check = false;
|
||||||
|
@ -1609,7 +1611,7 @@ namespace libtorrent
|
||||||
// downloaded a piece, and that no further attempts
|
// downloaded a piece, and that no further attempts
|
||||||
// to pick that piece should be made. The piece will
|
// to pick that piece should be made. The piece will
|
||||||
// be removed from the available piece list.
|
// be removed from the available piece list.
|
||||||
void piece_picker::we_have(int index)
|
void piece_picker::we_have(int const index)
|
||||||
{
|
{
|
||||||
#ifdef TORRENT_EXPENSIVE_INVARIANT_CHECKS
|
#ifdef TORRENT_EXPENSIVE_INVARIANT_CHECKS
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
|
@ -1621,7 +1623,7 @@ namespace libtorrent
|
||||||
std::cerr << "[" << this << "] " << "piece_picker::we_have("
|
std::cerr << "[" << this << "] " << "piece_picker::we_have("
|
||||||
<< index << ")" << std::endl;
|
<< index << ")" << std::endl;
|
||||||
#endif
|
#endif
|
||||||
piece_pos& p = m_piece_map[index];
|
piece_pos& p = m_piece_map[std::size_t(index)];
|
||||||
int const info_index = p.index;
|
int const info_index = p.index;
|
||||||
int const priority = p.priority(this);
|
int const priority = p.priority(this);
|
||||||
TORRENT_ASSERT(priority < int(m_priority_boundaries.size()) || m_dirty);
|
TORRENT_ASSERT(priority < int(m_priority_boundaries.size()) || m_dirty);
|
||||||
|
@ -1631,8 +1633,7 @@ namespace libtorrent
|
||||||
int state = p.download_queue();
|
int state = p.download_queue();
|
||||||
if (state != piece_pos::piece_open)
|
if (state != piece_pos::piece_open)
|
||||||
{
|
{
|
||||||
std::vector<downloading_piece>::iterator i
|
auto const i = find_dl_piece(state, index);
|
||||||
= find_dl_piece(state, index);
|
|
||||||
TORRENT_ASSERT(i != m_downloads[state].end());
|
TORRENT_ASSERT(i != m_downloads[state].end());
|
||||||
// decrement num_passed here to compensate
|
// decrement num_passed here to compensate
|
||||||
// for the unconditional increment further down
|
// for the unconditional increment further down
|
||||||
|
@ -1929,7 +1930,7 @@ namespace libtorrent
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
#endif
|
#endif
|
||||||
TORRENT_ASSERT(num_blocks > 0);
|
TORRENT_ASSERT(num_blocks > 0);
|
||||||
TORRENT_ASSERT(pieces.size() == m_piece_map.size());
|
TORRENT_ASSERT(pieces.size() == int(m_piece_map.size()));
|
||||||
|
|
||||||
TORRENT_ASSERT(!m_priority_boundaries.empty() || m_dirty);
|
TORRENT_ASSERT(!m_priority_boundaries.empty() || m_dirty);
|
||||||
|
|
||||||
|
@ -2290,7 +2291,7 @@ get_out:
|
||||||
// this peer has, and can pick from. Cap the stack allocation
|
// this peer has, and can pick from. Cap the stack allocation
|
||||||
// at 200 pieces.
|
// at 200 pieces.
|
||||||
|
|
||||||
int partials_size = (std::min)(200, int(
|
int partials_size = std::min(200, int(
|
||||||
m_downloads[piece_pos::piece_downloading].size()
|
m_downloads[piece_pos::piece_downloading].size()
|
||||||
+ m_downloads[piece_pos::piece_full].size()));
|
+ m_downloads[piece_pos::piece_full].size()));
|
||||||
if (partials_size == 0) return ret;
|
if (partials_size == 0) return ret;
|
||||||
|
@ -2340,14 +2341,10 @@ get_out:
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (std::vector<downloading_piece>::const_iterator i
|
for (auto const& dp : m_downloads[piece_pos::piece_full])
|
||||||
= m_downloads[piece_pos::piece_full].begin()
|
|
||||||
, end(m_downloads[piece_pos::piece_full].end());
|
|
||||||
i != end; ++i)
|
|
||||||
{
|
{
|
||||||
if (c == partials_size) break;
|
if (c == partials_size) break;
|
||||||
|
|
||||||
downloading_piece const& dp = *i;
|
|
||||||
TORRENT_ASSERT(dp.requested > 0);
|
TORRENT_ASSERT(dp.requested > 0);
|
||||||
// this peer doesn't have this piece, try again
|
// this peer doesn't have this piece, try again
|
||||||
if (!pieces[dp.index]) continue;
|
if (!pieces[dp.index]) continue;
|
||||||
|
@ -2365,23 +2362,21 @@ get_out:
|
||||||
while (partials_size > 0)
|
while (partials_size > 0)
|
||||||
{
|
{
|
||||||
pc.inc_stats_counter(counters::piece_picker_busy_loops);
|
pc.inc_stats_counter(counters::piece_picker_busy_loops);
|
||||||
int piece = random(partials_size-1);
|
int piece = int(random(partials_size - 1));
|
||||||
downloading_piece const* dp = partials[piece];
|
downloading_piece const* dp = partials[piece];
|
||||||
TORRENT_ASSERT(pieces[dp->index]);
|
TORRENT_ASSERT(pieces[dp->index]);
|
||||||
TORRENT_ASSERT(piece_priority(dp->index) > 0);
|
TORRENT_ASSERT(piece_priority(dp->index) > 0);
|
||||||
// fill in with blocks requested from other peers
|
// fill in with blocks requested from other peers
|
||||||
// as backups
|
// as backups
|
||||||
const int num_blocks_in_piece = blocks_in_piece(dp->index);
|
int const num_blocks_in_piece = blocks_in_piece(dp->index);
|
||||||
TORRENT_ASSERT(dp->requested > 0);
|
TORRENT_ASSERT(dp->requested > 0);
|
||||||
block_info const* binfo = blocks_for_piece(*dp);
|
block_info const* binfo = blocks_for_piece(*dp);
|
||||||
for (int j = 0; j < num_blocks_in_piece; ++j)
|
for (int j = 0; j < num_blocks_in_piece; ++j)
|
||||||
{
|
{
|
||||||
block_info const& info = binfo[j];
|
block_info const& info = binfo[j];
|
||||||
TORRENT_ASSERT(info.peer == nullptr
|
TORRENT_ASSERT(info.peer == nullptr || info.peer->in_use);
|
||||||
|| static_cast<torrent_peer*>(info.peer)->in_use);
|
|
||||||
TORRENT_ASSERT(info.piece_index == dp->index);
|
TORRENT_ASSERT(info.piece_index == dp->index);
|
||||||
if (info.state != block_info::state_requested
|
if (info.state != block_info::state_requested || info.peer == peer)
|
||||||
|| info.peer == peer)
|
|
||||||
continue;
|
continue;
|
||||||
temp.push_back(piece_block(dp->index, j));
|
temp.push_back(piece_block(dp->index, j));
|
||||||
}
|
}
|
||||||
|
@ -2396,7 +2391,7 @@ get_out:
|
||||||
|
|
||||||
// the piece we picked only had blocks outstanding requested
|
// the piece we picked only had blocks outstanding requested
|
||||||
// by ourself. Remove it and pick another one.
|
// by ourself. Remove it and pick another one.
|
||||||
partials[piece] = partials[partials_size-1];
|
partials[piece] = partials[partials_size - 1];
|
||||||
--partials_size;
|
--partials_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2477,7 +2472,7 @@ get_out:
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(index >= 0);
|
TORRENT_ASSERT(index >= 0);
|
||||||
TORRENT_ASSERT(index < int(m_piece_map.size()));
|
TORRENT_ASSERT(index < int(m_piece_map.size()));
|
||||||
piece_pos const& p = m_piece_map[index];
|
piece_pos const& p = m_piece_map[std::size_t(index)];
|
||||||
return p.index == piece_pos::we_have_index;
|
return p.index == piece_pos::we_have_index;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2495,19 +2490,19 @@ get_out:
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(piece >= 0 && piece < int(m_piece_map.size()));
|
TORRENT_ASSERT(piece >= 0 && piece < int(m_piece_map.size()));
|
||||||
return bitmask[piece]
|
return bitmask[piece]
|
||||||
&& !m_piece_map[piece].have()
|
&& !m_piece_map[std::size_t(piece)].have()
|
||||||
&& !m_piece_map[piece].filtered();
|
&& !m_piece_map[std::size_t(piece)].filtered();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool piece_picker::can_pick(int piece, bitfield const& bitmask) const
|
bool piece_picker::can_pick(int piece, bitfield const& bitmask) const
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(piece >= 0 && piece < int(m_piece_map.size()));
|
TORRENT_ASSERT(piece >= 0 && piece < int(m_piece_map.size()));
|
||||||
return bitmask[piece]
|
return bitmask[piece]
|
||||||
&& !m_piece_map[piece].have()
|
&& !m_piece_map[std::size_t(piece)].have()
|
||||||
// TODO: when expanding pieces for cache stripe reasons,
|
// TODO: when expanding pieces for cache stripe reasons,
|
||||||
// the !downloading condition doesn't make much sense
|
// the !downloading condition doesn't make much sense
|
||||||
&& !m_piece_map[piece].downloading()
|
&& !m_piece_map[std::size_t(piece)].downloading()
|
||||||
&& !m_piece_map[piece].filtered();
|
&& !m_piece_map[std::size_t(piece)].filtered();
|
||||||
}
|
}
|
||||||
|
|
||||||
#if TORRENT_USE_INVARIANT_CHECKS
|
#if TORRENT_USE_INVARIANT_CHECKS
|
||||||
|
@ -2538,7 +2533,7 @@ get_out:
|
||||||
// the first-fit range, which would be better
|
// the first-fit range, which would be better
|
||||||
std::tuple<bool, bool, int, int> piece_picker::requested_from(
|
std::tuple<bool, bool, int, int> piece_picker::requested_from(
|
||||||
piece_picker::downloading_piece const& p
|
piece_picker::downloading_piece const& p
|
||||||
, int num_blocks_in_piece, torrent_peer* peer) const
|
, int const num_blocks_in_piece, torrent_peer* peer) const
|
||||||
{
|
{
|
||||||
bool exclusive = true;
|
bool exclusive = true;
|
||||||
bool exclusive_active = true;
|
bool exclusive_active = true;
|
||||||
|
@ -2549,7 +2544,7 @@ get_out:
|
||||||
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 = binfo[j];
|
piece_picker::block_info const& info = binfo[j];
|
||||||
TORRENT_ASSERT(info.peer == nullptr || static_cast<torrent_peer*>(info.peer)->in_use);
|
TORRENT_ASSERT(info.peer == nullptr || 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)
|
||||||
{
|
{
|
||||||
|
@ -2858,7 +2853,7 @@ get_out:
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<piece_picker::downloading_piece>::iterator piece_picker::find_dl_piece(
|
std::vector<piece_picker::downloading_piece>::iterator piece_picker::find_dl_piece(
|
||||||
int queue, int index)
|
int const queue, int const index)
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(queue >= 0 && queue < piece_pos::num_download_categories);
|
TORRENT_ASSERT(queue >= 0 && queue < piece_pos::num_download_categories);
|
||||||
downloading_piece cmp;
|
downloading_piece cmp;
|
||||||
|
@ -2967,7 +2962,7 @@ get_out:
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(block.block_index != piece_block::invalid.block_index);
|
TORRENT_ASSERT(block.block_index != piece_block::invalid.block_index);
|
||||||
TORRENT_ASSERT(block.piece_index != piece_block::invalid.piece_index);
|
TORRENT_ASSERT(block.piece_index != piece_block::invalid.piece_index);
|
||||||
TORRENT_ASSERT(block.piece_index < m_piece_map.size());
|
TORRENT_ASSERT(block.piece_index < int(m_piece_map.size()));
|
||||||
|
|
||||||
int state = m_piece_map[block.piece_index].download_queue();
|
int state = m_piece_map[block.piece_index].download_queue();
|
||||||
if (state == piece_pos::piece_open) return false;
|
if (state == piece_pos::piece_open) return false;
|
||||||
|
@ -2985,7 +2980,7 @@ get_out:
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(block.block_index != piece_block::invalid.block_index);
|
TORRENT_ASSERT(block.block_index != piece_block::invalid.block_index);
|
||||||
TORRENT_ASSERT(block.piece_index != piece_block::invalid.piece_index);
|
TORRENT_ASSERT(block.piece_index != piece_block::invalid.piece_index);
|
||||||
TORRENT_ASSERT(block.piece_index < m_piece_map.size());
|
TORRENT_ASSERT(block.piece_index < int(m_piece_map.size()));
|
||||||
|
|
||||||
if (m_piece_map[block.piece_index].index == piece_pos::we_have_index) return true;
|
if (m_piece_map[block.piece_index].index == piece_pos::we_have_index) return true;
|
||||||
int state = m_piece_map[block.piece_index].download_queue();
|
int state = m_piece_map[block.piece_index].download_queue();
|
||||||
|
@ -3004,7 +2999,7 @@ get_out:
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(block.block_index != piece_block::invalid.block_index);
|
TORRENT_ASSERT(block.block_index != piece_block::invalid.block_index);
|
||||||
TORRENT_ASSERT(block.piece_index != piece_block::invalid.piece_index);
|
TORRENT_ASSERT(block.piece_index != piece_block::invalid.piece_index);
|
||||||
TORRENT_ASSERT(block.piece_index < m_piece_map.size());
|
TORRENT_ASSERT(block.piece_index < int(m_piece_map.size()));
|
||||||
|
|
||||||
piece_pos const& p = m_piece_map[block.piece_index];
|
piece_pos const& p = m_piece_map[block.piece_index];
|
||||||
if (p.index == piece_pos::we_have_index) return true;
|
if (p.index == piece_pos::we_have_index) return true;
|
||||||
|
@ -3028,11 +3023,11 @@ get_out:
|
||||||
<< block.piece_index << ", " << block.block_index << "} )" << std::endl;
|
<< block.piece_index << ", " << block.block_index << "} )" << std::endl;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
TORRENT_ASSERT(peer == nullptr || static_cast<torrent_peer*>(peer)->in_use);
|
TORRENT_ASSERT(peer == nullptr || peer->in_use);
|
||||||
TORRENT_ASSERT(block.block_index != piece_block::invalid.block_index);
|
TORRENT_ASSERT(block.block_index != piece_block::invalid.block_index);
|
||||||
TORRENT_ASSERT(block.piece_index != piece_block::invalid.piece_index);
|
TORRENT_ASSERT(block.piece_index != piece_block::invalid.piece_index);
|
||||||
TORRENT_ASSERT(block.piece_index < m_piece_map.size());
|
TORRENT_ASSERT(block.piece_index < int(m_piece_map.size()));
|
||||||
TORRENT_ASSERT(int(block.block_index) < blocks_in_piece(block.piece_index));
|
TORRENT_ASSERT(block.block_index < blocks_in_piece(block.piece_index));
|
||||||
TORRENT_ASSERT(!m_piece_map[block.piece_index].have());
|
TORRENT_ASSERT(!m_piece_map[block.piece_index].have());
|
||||||
|
|
||||||
piece_pos& p = m_piece_map[block.piece_index];
|
piece_pos& p = m_piece_map[block.piece_index];
|
||||||
|
@ -3051,7 +3046,7 @@ get_out:
|
||||||
|
|
||||||
if (prio >= 0 && !m_dirty) update(prio, p.index);
|
if (prio >= 0 && !m_dirty) update(prio, p.index);
|
||||||
|
|
||||||
dlpiece_iter dp = add_download_piece(block.piece_index);
|
auto const dp = add_download_piece(block.piece_index);
|
||||||
block_info* binfo = blocks_for_piece(*dp);
|
block_info* binfo = blocks_for_piece(*dp);
|
||||||
block_info& info = binfo[block.block_index];
|
block_info& info = binfo[block.block_index];
|
||||||
TORRENT_ASSERT(info.piece_index == block.piece_index);
|
TORRENT_ASSERT(info.piece_index == block.piece_index);
|
||||||
|
@ -3129,7 +3124,7 @@ get_out:
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(block.block_index != piece_block::invalid.block_index);
|
TORRENT_ASSERT(block.block_index != piece_block::invalid.block_index);
|
||||||
TORRENT_ASSERT(block.piece_index != piece_block::invalid.piece_index);
|
TORRENT_ASSERT(block.piece_index != piece_block::invalid.piece_index);
|
||||||
TORRENT_ASSERT(block.piece_index < m_piece_map.size());
|
TORRENT_ASSERT(block.piece_index < int(m_piece_map.size()));
|
||||||
TORRENT_ASSERT(block.block_index < blocks_in_piece(block.piece_index));
|
TORRENT_ASSERT(block.block_index < blocks_in_piece(block.piece_index));
|
||||||
|
|
||||||
piece_pos const& p = m_piece_map[block.piece_index];
|
piece_pos const& p = m_piece_map[block.piece_index];
|
||||||
|
@ -3179,8 +3174,8 @@ get_out:
|
||||||
|
|
||||||
TORRENT_ASSERT(block.block_index != piece_block::invalid.block_index);
|
TORRENT_ASSERT(block.block_index != piece_block::invalid.block_index);
|
||||||
TORRENT_ASSERT(block.piece_index != piece_block::invalid.piece_index);
|
TORRENT_ASSERT(block.piece_index != piece_block::invalid.piece_index);
|
||||||
TORRENT_ASSERT(block.piece_index < m_piece_map.size());
|
TORRENT_ASSERT(block.piece_index < int(m_piece_map.size()));
|
||||||
TORRENT_ASSERT(int(block.block_index) < blocks_in_piece(block.piece_index));
|
TORRENT_ASSERT(block.block_index < blocks_in_piece(block.piece_index));
|
||||||
// this is not valid for web peers
|
// this is not valid for web peers
|
||||||
// TORRENT_ASSERT(peer != 0);
|
// TORRENT_ASSERT(peer != 0);
|
||||||
|
|
||||||
|
@ -3198,7 +3193,7 @@ get_out:
|
||||||
// the piece priority was set to 0
|
// the piece priority was set to 0
|
||||||
if (prio >= 0 && !m_dirty) update(prio, p.index);
|
if (prio >= 0 && !m_dirty) update(prio, p.index);
|
||||||
|
|
||||||
dlpiece_iter dp = add_download_piece(block.piece_index);
|
auto const dp = add_download_piece(block.piece_index);
|
||||||
block_info* binfo = blocks_for_piece(*dp);
|
block_info* binfo = blocks_for_piece(*dp);
|
||||||
block_info& info = binfo[block.block_index];
|
block_info& info = binfo[block.block_index];
|
||||||
TORRENT_ASSERT(&info >= &m_block_info[0]);
|
TORRENT_ASSERT(&info >= &m_block_info[0]);
|
||||||
|
@ -3367,8 +3362,8 @@ get_out:
|
||||||
|
|
||||||
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 < int(m_piece_map.size()));
|
||||||
TORRENT_ASSERT(int(block.block_index) < blocks_in_piece(block.piece_index));
|
TORRENT_ASSERT(block.block_index < blocks_in_piece(block.piece_index));
|
||||||
|
|
||||||
piece_pos& p = m_piece_map[block.piece_index];
|
piece_pos& p = m_piece_map[block.piece_index];
|
||||||
|
|
||||||
|
@ -3430,8 +3425,8 @@ get_out:
|
||||||
TORRENT_ASSERT(peer == nullptr || static_cast<torrent_peer*>(peer)->in_use);
|
TORRENT_ASSERT(peer == nullptr || static_cast<torrent_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 < int(m_piece_map.size()));
|
||||||
TORRENT_ASSERT(int(block.block_index) < blocks_in_piece(block.piece_index));
|
TORRENT_ASSERT(block.block_index < blocks_in_piece(block.piece_index));
|
||||||
|
|
||||||
piece_pos& p = m_piece_map[block.piece_index];
|
piece_pos& p = m_piece_map[block.piece_index];
|
||||||
|
|
||||||
|
@ -3450,7 +3445,7 @@ get_out:
|
||||||
p.download_state = piece_pos::piece_downloading;
|
p.download_state = piece_pos::piece_downloading;
|
||||||
if (prio >= 0 && !m_dirty) update(prio, p.index);
|
if (prio >= 0 && !m_dirty) update(prio, p.index);
|
||||||
|
|
||||||
dlpiece_iter dp = add_download_piece(block.piece_index);
|
auto const dp = add_download_piece(block.piece_index);
|
||||||
block_info* binfo = blocks_for_piece(*dp);
|
block_info* binfo = blocks_for_piece(*dp);
|
||||||
block_info& info = binfo[block.block_index];
|
block_info& info = binfo[block.block_index];
|
||||||
TORRENT_ASSERT(&info >= &m_block_info[0]);
|
TORRENT_ASSERT(&info >= &m_block_info[0]);
|
||||||
|
@ -3576,8 +3571,8 @@ get_out:
|
||||||
|
|
||||||
TORRENT_ASSERT(block.block_index != piece_block::invalid.block_index);
|
TORRENT_ASSERT(block.block_index != piece_block::invalid.block_index);
|
||||||
TORRENT_ASSERT(block.piece_index != piece_block::invalid.piece_index);
|
TORRENT_ASSERT(block.piece_index != piece_block::invalid.piece_index);
|
||||||
TORRENT_ASSERT(block.piece_index < m_piece_map.size());
|
TORRENT_ASSERT(block.piece_index < int(m_piece_map.size()));
|
||||||
TORRENT_ASSERT(int(block.block_index) < blocks_in_piece(block.piece_index));
|
TORRENT_ASSERT(block.block_index < blocks_in_piece(block.piece_index));
|
||||||
|
|
||||||
int state = m_piece_map[block.piece_index].download_queue();
|
int state = m_piece_map[block.piece_index].download_queue();
|
||||||
if (state == piece_pos::piece_open) return;
|
if (state == piece_pos::piece_open) return;
|
||||||
|
@ -3607,7 +3602,7 @@ get_out:
|
||||||
if (info.peer == peer) info.peer = nullptr;
|
if (info.peer == peer) info.peer = nullptr;
|
||||||
TORRENT_ASSERT(info.peers.size() == info.num_peers);
|
TORRENT_ASSERT(info.peers.size() == info.num_peers);
|
||||||
|
|
||||||
TORRENT_ASSERT(int(block.block_index) < blocks_in_piece(block.piece_index));
|
TORRENT_ASSERT(block.block_index < blocks_in_piece(block.piece_index));
|
||||||
|
|
||||||
// if there are other peers, leave the block requested
|
// if there are other peers, leave the block requested
|
||||||
if (info.num_peers > 0) return;
|
if (info.num_peers > 0) return;
|
||||||
|
|
|
@ -40,7 +40,7 @@ int receive_buffer::max_receive() const
|
||||||
return int(m_recv_buffer.size() - m_recv_end);
|
return int(m_recv_buffer.size() - m_recv_end);
|
||||||
}
|
}
|
||||||
|
|
||||||
span<char> receive_buffer::reserve(int size)
|
span<char> receive_buffer::reserve(int const size)
|
||||||
{
|
{
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
TORRENT_ASSERT(size > 0);
|
TORRENT_ASSERT(size > 0);
|
||||||
|
@ -49,7 +49,7 @@ span<char> receive_buffer::reserve(int size)
|
||||||
// normalize() must be called before receiving more data
|
// normalize() must be called before receiving more data
|
||||||
TORRENT_ASSERT(m_recv_start == 0);
|
TORRENT_ASSERT(m_recv_start == 0);
|
||||||
|
|
||||||
if (m_recv_buffer.size() < m_recv_end + size)
|
if (int(m_recv_buffer.size()) < m_recv_end + size)
|
||||||
{
|
{
|
||||||
int const new_size = std::max(m_recv_end + size, m_packet_size);
|
int const new_size = std::max(m_recv_end + size, m_packet_size);
|
||||||
buffer new_buffer(new_size
|
buffer new_buffer(new_size
|
||||||
|
@ -144,7 +144,7 @@ span<char const> receive_buffer::get() const
|
||||||
return span<char const>();
|
return span<char const>();
|
||||||
}
|
}
|
||||||
|
|
||||||
TORRENT_ASSERT(m_recv_start + m_recv_pos <= m_recv_buffer.size());
|
TORRENT_ASSERT(m_recv_start + m_recv_pos <= int(m_recv_buffer.size()));
|
||||||
return span<char const>(m_recv_buffer).subspan(m_recv_start, m_recv_pos);
|
return span<char const>(m_recv_buffer).subspan(m_recv_start, m_recv_pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -169,7 +169,7 @@ span<char> receive_buffer::mutable_buffer(int const bytes)
|
||||||
// in the receive buffer that have been parsed and processed.
|
// in the receive buffer that have been parsed and processed.
|
||||||
// it may also shrink the size of the buffer allocation if we haven't been using
|
// it may also shrink the size of the buffer allocation if we haven't been using
|
||||||
// enough of it lately.
|
// enough of it lately.
|
||||||
void receive_buffer::normalize(int force_shrink)
|
void receive_buffer::normalize(int const force_shrink)
|
||||||
{
|
{
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
TORRENT_ASSERT(m_recv_end >= m_recv_start);
|
TORRENT_ASSERT(m_recv_end >= m_recv_start);
|
||||||
|
@ -178,7 +178,7 @@ void receive_buffer::normalize(int force_shrink)
|
||||||
|
|
||||||
// if the running average drops below half of the current buffer size,
|
// if the running average drops below half of the current buffer size,
|
||||||
// reallocate a smaller one.
|
// reallocate a smaller one.
|
||||||
bool const shrink_buffer = m_recv_buffer.size() / 2 > m_watermark.mean()
|
bool const shrink_buffer = int(m_recv_buffer.size()) / 2 > m_watermark.mean()
|
||||||
&& m_watermark.mean() > (m_recv_end - m_recv_start);
|
&& m_watermark.mean() > (m_recv_end - m_recv_start);
|
||||||
|
|
||||||
span<char const> bytes_to_shift(
|
span<char const> bytes_to_shift(
|
||||||
|
@ -212,10 +212,10 @@ void receive_buffer::normalize(int force_shrink)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void receive_buffer::reset(int packet_size)
|
void receive_buffer::reset(int const packet_size)
|
||||||
{
|
{
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
TORRENT_ASSERT(m_recv_buffer.size() >= m_recv_end);
|
TORRENT_ASSERT(int(m_recv_buffer.size()) >= m_recv_end);
|
||||||
TORRENT_ASSERT(packet_size > 0);
|
TORRENT_ASSERT(packet_size > 0);
|
||||||
if (m_recv_end > m_packet_size)
|
if (m_recv_end > m_packet_size)
|
||||||
{
|
{
|
||||||
|
|
|
@ -103,7 +103,7 @@ void resolve_links::match(std::shared_ptr<const torrent_info> const& ti
|
||||||
int our_piece = m_torrent_file->files().map_file(
|
int our_piece = m_torrent_file->files().map_file(
|
||||||
iter->second, 0, 0).piece;
|
iter->second, 0, 0).piece;
|
||||||
|
|
||||||
int num_pieces = (file_size + piece_size - 1) / piece_size;
|
int num_pieces = int((file_size + piece_size - 1) / piece_size);
|
||||||
|
|
||||||
bool match = true;
|
bool match = true;
|
||||||
for (int p = 0; p < num_pieces; ++p, ++their_piece, ++our_piece)
|
for (int p = 0; p < num_pieces; ++p, ++their_piece, ++our_piece)
|
||||||
|
|
|
@ -571,7 +571,7 @@ namespace libtorrent
|
||||||
|
|
||||||
void session_handle::dht_put_item(std::array<char, 32> key
|
void session_handle::dht_put_item(std::array<char, 32> key
|
||||||
, std::function<void(entry&, std::array<char,64>&
|
, std::function<void(entry&, std::array<char,64>&
|
||||||
, std::uint64_t&, std::string const&)> cb
|
, std::int64_t&, std::string const&)> cb
|
||||||
, std::string salt)
|
, std::string salt)
|
||||||
{
|
{
|
||||||
#ifndef TORRENT_DISABLE_DHT
|
#ifndef TORRENT_DISABLE_DHT
|
||||||
|
|
|
@ -598,15 +598,17 @@ namespace aux {
|
||||||
|
|
||||||
// this specific output is parsed by tools/parse_session_stats.py
|
// this specific output is parsed by tools/parse_session_stats.py
|
||||||
// if this is changed, that parser should also be changed
|
// if this is changed, that parser should also be changed
|
||||||
std::string stats_header = "session stats header: ";
|
|
||||||
std::vector<stats_metric> stats = session_stats_metrics();
|
std::vector<stats_metric> stats = session_stats_metrics();
|
||||||
std::sort(stats.begin(), stats.end()
|
std::sort(stats.begin(), stats.end()
|
||||||
, [] (stats_metric const& lhs, stats_metric const& rhs)
|
, [] (stats_metric const& lhs, stats_metric const& rhs)
|
||||||
{ return lhs.value_index < rhs.value_index; });
|
{ return lhs.value_index < rhs.value_index; });
|
||||||
for (int i = 0; i < stats.size(); ++i)
|
std::string stats_header = "session stats header: ";
|
||||||
|
bool first = true;
|
||||||
|
for (auto const& s : stats)
|
||||||
{
|
{
|
||||||
if (i > 0) stats_header += ", ";
|
if (!first) stats_header += ", ";
|
||||||
stats_header += stats[i].name;
|
stats_header += s.name;
|
||||||
|
first = false;
|
||||||
}
|
}
|
||||||
m_alerts.emplace_alert<log_alert>(stats_header.c_str());
|
m_alerts.emplace_alert<log_alert>(stats_header.c_str());
|
||||||
}
|
}
|
||||||
|
@ -1756,11 +1758,11 @@ namespace aux {
|
||||||
// of a new socket failing to bind due to a conflict with a stale socket
|
// of a new socket failing to bind due to a conflict with a stale socket
|
||||||
std::vector<listen_endpoint_t> eps;
|
std::vector<listen_endpoint_t> eps;
|
||||||
|
|
||||||
for (int i = 0; i < m_listen_interfaces.size(); ++i)
|
for (auto const& iface : m_listen_interfaces)
|
||||||
{
|
{
|
||||||
std::string const& device = m_listen_interfaces[i].device;
|
std::string const& device = iface.device;
|
||||||
int const port = m_listen_interfaces[i].port;
|
int const port = iface.port;
|
||||||
bool const ssl = m_listen_interfaces[i].ssl;
|
bool const ssl = iface.ssl;
|
||||||
|
|
||||||
#ifndef TORRENT_USE_OPENSSL
|
#ifndef TORRENT_USE_OPENSSL
|
||||||
if (ssl)
|
if (ssl)
|
||||||
|
@ -1817,13 +1819,13 @@ namespace aux {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int k = 0; k < int(ifs.size()); ++k)
|
for (auto const& ipface : ifs)
|
||||||
{
|
{
|
||||||
// we're looking for a specific interface, and its address
|
// we're looking for a specific interface, and its address
|
||||||
// (which must be of the same family as the address we're
|
// (which must be of the same family as the address we're
|
||||||
// connecting to)
|
// connecting to)
|
||||||
if (device != ifs[k].name) continue;
|
if (device != ipface.name) continue;
|
||||||
eps.emplace_back(ifs[k].interface_address, port, device, ssl);
|
eps.emplace_back(ipface.interface_address, port, device, ssl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1834,9 +1836,12 @@ namespace aux {
|
||||||
{
|
{
|
||||||
// TODO notify interested parties of this socket's demise
|
// TODO notify interested parties of this socket's demise
|
||||||
#ifndef TORRENT_DISABLE_LOGGING
|
#ifndef TORRENT_DISABLE_LOGGING
|
||||||
|
if (should_log())
|
||||||
|
{
|
||||||
session_log("Closing listen socket for %s on device \"%s\""
|
session_log("Closing listen socket for %s on device \"%s\""
|
||||||
, print_endpoint(remove_iter->local_endpoint).c_str()
|
, print_endpoint(remove_iter->local_endpoint).c_str()
|
||||||
, remove_iter->device.c_str());
|
, remove_iter->device.c_str());
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
if (remove_iter->sock) remove_iter->sock->close(ec);
|
if (remove_iter->sock) remove_iter->sock->close(ec);
|
||||||
if (remove_iter->udp_sock) remove_iter->udp_sock->close();
|
if (remove_iter->udp_sock) remove_iter->udp_sock->close();
|
||||||
|
@ -5195,10 +5200,8 @@ namespace aux {
|
||||||
std::vector<std::pair<std::string, int>> nodes;
|
std::vector<std::pair<std::string, int>> nodes;
|
||||||
parse_comma_separated_string_port(node_list, nodes);
|
parse_comma_separated_string_port(node_list, nodes);
|
||||||
|
|
||||||
for (int i = 0; i < nodes.size(); ++i)
|
for (auto const& n : nodes)
|
||||||
{
|
add_dht_router(n);
|
||||||
add_dht_router(nodes[i]);
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5691,7 +5694,7 @@ namespace aux {
|
||||||
|
|
||||||
void put_mutable_callback(dht::item& i
|
void put_mutable_callback(dht::item& i
|
||||||
, std::function<void(entry&, std::array<char, 64>&
|
, std::function<void(entry&, std::array<char, 64>&
|
||||||
, std::uint64_t&, std::string const&)> cb)
|
, std::int64_t&, std::string const&)> cb)
|
||||||
{
|
{
|
||||||
entry value = i.value();
|
entry value = i.value();
|
||||||
dht::signature sig = i.sig();
|
dht::signature sig = i.sig();
|
||||||
|
@ -5727,7 +5730,7 @@ namespace aux {
|
||||||
|
|
||||||
void session_impl::dht_put_mutable_item(std::array<char, 32> key
|
void session_impl::dht_put_mutable_item(std::array<char, 32> key
|
||||||
, std::function<void(entry&, std::array<char,64>&
|
, std::function<void(entry&, std::array<char,64>&
|
||||||
, std::uint64_t&, std::string const&)> cb
|
, std::int64_t&, std::string const&)> cb
|
||||||
, std::string salt)
|
, std::string salt)
|
||||||
{
|
{
|
||||||
if (!m_dht) return;
|
if (!m_dht) return;
|
||||||
|
@ -5960,7 +5963,7 @@ namespace aux {
|
||||||
|
|
||||||
void session_impl::update_queued_disk_bytes()
|
void session_impl::update_queued_disk_bytes()
|
||||||
{
|
{
|
||||||
std::uint64_t cache_size = m_settings.get_int(settings_pack::cache_size);
|
int const cache_size = m_settings.get_int(settings_pack::cache_size);
|
||||||
if (m_settings.get_int(settings_pack::max_queued_disk_bytes) / 16 / 1024
|
if (m_settings.get_int(settings_pack::max_queued_disk_bytes) / 16 / 1024
|
||||||
> cache_size / 2
|
> cache_size / 2
|
||||||
&& cache_size > 5
|
&& cache_size > 5
|
||||||
|
|
|
@ -533,7 +533,7 @@ namespace libtorrent
|
||||||
std::vector<stats_metric> session_stats_metrics()
|
std::vector<stats_metric> session_stats_metrics()
|
||||||
{
|
{
|
||||||
std::vector<stats_metric> stats;
|
std::vector<stats_metric> stats;
|
||||||
const int num = sizeof(metrics)/sizeof(metrics[0]);
|
int const num = sizeof(metrics) / sizeof(metrics[0]);
|
||||||
stats.resize(num);
|
stats.resize(num);
|
||||||
for (int i = 0; i < num; ++i)
|
for (int i = 0; i < num; ++i)
|
||||||
{
|
{
|
||||||
|
|
|
@ -37,6 +37,7 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include "libtorrent/aux_/session_impl.hpp"
|
#include "libtorrent/aux_/session_impl.hpp"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <array>
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
@ -98,8 +99,8 @@ namespace libtorrent
|
||||||
|
|
||||||
using aux::session_impl;
|
using aux::session_impl;
|
||||||
|
|
||||||
str_setting_entry_t str_settings[settings_pack::num_string_settings] =
|
std::array<str_setting_entry_t, settings_pack::num_string_settings> str_settings =
|
||||||
{
|
{{
|
||||||
SET(user_agent, "libtorrent/" LIBTORRENT_VERSION, &session_impl::update_user_agent),
|
SET(user_agent, "libtorrent/" LIBTORRENT_VERSION, &session_impl::update_user_agent),
|
||||||
SET(announce_ip, nullptr, nullptr),
|
SET(announce_ip, nullptr, nullptr),
|
||||||
SET(mmap_cache, nullptr, nullptr),
|
SET(mmap_cache, nullptr, nullptr),
|
||||||
|
@ -116,10 +117,10 @@ namespace libtorrent
|
||||||
SET(i2p_hostname, "", &session_impl::update_i2p_bridge),
|
SET(i2p_hostname, "", &session_impl::update_i2p_bridge),
|
||||||
SET(peer_fingerprint, "-LT1200-", &session_impl::update_peer_fingerprint),
|
SET(peer_fingerprint, "-LT1200-", &session_impl::update_peer_fingerprint),
|
||||||
SET(dht_bootstrap_nodes, "dht.libtorrent.org:25401", &session_impl::update_dht_bootstrap_nodes)
|
SET(dht_bootstrap_nodes, "dht.libtorrent.org:25401", &session_impl::update_dht_bootstrap_nodes)
|
||||||
};
|
}};
|
||||||
|
|
||||||
bool_setting_entry_t bool_settings[settings_pack::num_bool_settings] =
|
std::array<bool_setting_entry_t, settings_pack::num_bool_settings> bool_settings =
|
||||||
{
|
{{
|
||||||
SET(allow_multiple_connections_per_ip, false, nullptr),
|
SET(allow_multiple_connections_per_ip, false, nullptr),
|
||||||
DEPRECATED_SET(ignore_limits_on_local_network, true, &session_impl::update_ignore_rate_limits_on_local_network),
|
DEPRECATED_SET(ignore_limits_on_local_network, true, &session_impl::update_ignore_rate_limits_on_local_network),
|
||||||
SET(send_redundant_have, true, nullptr),
|
SET(send_redundant_have, true, nullptr),
|
||||||
|
@ -188,10 +189,10 @@ namespace libtorrent
|
||||||
SET(proxy_peer_connections, true, nullptr),
|
SET(proxy_peer_connections, true, nullptr),
|
||||||
SET(auto_sequential, true, &session_impl::update_auto_sequential),
|
SET(auto_sequential, true, &session_impl::update_auto_sequential),
|
||||||
SET(proxy_tracker_connections, true, nullptr),
|
SET(proxy_tracker_connections, true, nullptr),
|
||||||
};
|
}};
|
||||||
|
|
||||||
int_setting_entry_t int_settings[settings_pack::num_int_settings] =
|
std::array<int_setting_entry_t, settings_pack::num_int_settings> int_settings =
|
||||||
{
|
{{
|
||||||
SET(tracker_completion_timeout, 30, nullptr),
|
SET(tracker_completion_timeout, 30, nullptr),
|
||||||
SET(tracker_receive_timeout, 10, nullptr),
|
SET(tracker_receive_timeout, 10, nullptr),
|
||||||
SET(stop_tracker_timeout, 5, nullptr),
|
SET(stop_tracker_timeout, 5, nullptr),
|
||||||
|
@ -319,7 +320,7 @@ namespace libtorrent
|
||||||
SET(proxy_port, 0, &session_impl::update_proxy),
|
SET(proxy_port, 0, &session_impl::update_proxy),
|
||||||
SET(i2p_port, 0, &session_impl::update_i2p_bridge),
|
SET(i2p_port, 0, &session_impl::update_i2p_bridge),
|
||||||
SET(cache_size_volatile, 256, nullptr)
|
SET(cache_size_volatile, 256, nullptr)
|
||||||
};
|
}};
|
||||||
|
|
||||||
#undef SET
|
#undef SET
|
||||||
#undef SET_DEPRECATED
|
#undef SET_DEPRECATED
|
||||||
|
@ -328,20 +329,20 @@ namespace libtorrent
|
||||||
|
|
||||||
int setting_by_name(std::string const& key)
|
int setting_by_name(std::string const& key)
|
||||||
{
|
{
|
||||||
for (int k = 0; k < sizeof(str_settings)/sizeof(str_settings[0]); ++k)
|
for (std::size_t k = 0; k < str_settings.size(); ++k)
|
||||||
{
|
{
|
||||||
if (key != str_settings[k].name) continue;
|
if (key != str_settings[k].name) continue;
|
||||||
return settings_pack::string_type_base + k;
|
return settings_pack::string_type_base + int(k);
|
||||||
}
|
}
|
||||||
for (int k = 0; k < sizeof(int_settings)/sizeof(int_settings[0]); ++k)
|
for (std::size_t k = 0; k < int_settings.size(); ++k)
|
||||||
{
|
{
|
||||||
if (key != int_settings[k].name) continue;
|
if (key != int_settings[k].name) continue;
|
||||||
return settings_pack::int_type_base + k;
|
return settings_pack::int_type_base + int(k);
|
||||||
}
|
}
|
||||||
for (int k = 0; k < sizeof(bool_settings)/sizeof(bool_settings[0]); ++k)
|
for (std::size_t k = 0; k < bool_settings.size(); ++k)
|
||||||
{
|
{
|
||||||
if (key != bool_settings[k].name) continue;
|
if (key != bool_settings[k].name) continue;
|
||||||
return settings_pack::bool_type_base + k;
|
return settings_pack::bool_type_base + int(k);
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -377,27 +378,27 @@ namespace libtorrent
|
||||||
case bdecode_node::int_t:
|
case bdecode_node::int_t:
|
||||||
{
|
{
|
||||||
bool found = false;
|
bool found = false;
|
||||||
for (int k = 0; k < sizeof(int_settings) / sizeof(int_settings[0]); ++k)
|
for (std::size_t k = 0; k < int_settings.size(); ++k)
|
||||||
{
|
{
|
||||||
if (key != int_settings[k].name) continue;
|
if (key != int_settings[k].name) continue;
|
||||||
pack.set_int(settings_pack::int_type_base + k, val.int_value());
|
pack.set_int(settings_pack::int_type_base + int(k), int(val.int_value()));
|
||||||
found = true;
|
found = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (found) continue;
|
if (found) continue;
|
||||||
for (int k = 0; k < sizeof(bool_settings) / sizeof(bool_settings[0]); ++k)
|
for (std::size_t k = 0; k < bool_settings.size(); ++k)
|
||||||
{
|
{
|
||||||
if (key != bool_settings[k].name) continue;
|
if (key != bool_settings[k].name) continue;
|
||||||
pack.set_bool(settings_pack::bool_type_base + k, val.int_value() != 0);
|
pack.set_bool(settings_pack::bool_type_base + int(k), val.int_value() != 0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case bdecode_node::string_t:
|
case bdecode_node::string_t:
|
||||||
for (int k = 0; k < sizeof(str_settings) / sizeof(str_settings[0]); ++k)
|
for (std::size_t k = 0; k < str_settings.size(); ++k)
|
||||||
{
|
{
|
||||||
if (key != str_settings[k].name) continue;
|
if (key != str_settings[k].name) continue;
|
||||||
pack.set_str(settings_pack::string_type_base + k, val.string_value().to_string());
|
pack.set_str(settings_pack::string_type_base + int(k), val.string_value().to_string());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -1126,7 +1126,7 @@ namespace libtorrent
|
||||||
TORRENT_ASSERT(files.is_loaded());
|
TORRENT_ASSERT(files.is_loaded());
|
||||||
|
|
||||||
// find the file iterator and file offset
|
// find the file iterator and file offset
|
||||||
std::uint64_t torrent_offset = piece * std::uint64_t(files.piece_length()) + offset;
|
std::int64_t const torrent_offset = piece * std::int64_t(files.piece_length()) + offset;
|
||||||
int file_index = files.file_index_at_offset(torrent_offset);
|
int file_index = files.file_index_at_offset(torrent_offset);
|
||||||
TORRENT_ASSERT(torrent_offset >= files.file_offset(file_index));
|
TORRENT_ASSERT(torrent_offset >= files.file_offset(file_index));
|
||||||
TORRENT_ASSERT(torrent_offset < files.file_offset(file_index) + files.file_size(file_index));
|
TORRENT_ASSERT(torrent_offset < files.file_offset(file_index) + files.file_size(file_index));
|
||||||
|
@ -1143,7 +1143,7 @@ namespace libtorrent
|
||||||
// advance_bufs())
|
// advance_bufs())
|
||||||
TORRENT_ALLOCA(current_buf, file::iovec_t, bufs.size());
|
TORRENT_ALLOCA(current_buf, file::iovec_t, bufs.size());
|
||||||
copy_bufs(bufs, size, current_buf);
|
copy_bufs(bufs, size, current_buf);
|
||||||
TORRENT_ASSERT(count_bufs(current_buf, size) == bufs.size());
|
TORRENT_ASSERT(count_bufs(current_buf, size) == int(bufs.size()));
|
||||||
|
|
||||||
TORRENT_ALLOCA(tmp_buf, file::iovec_t, bufs.size());
|
TORRENT_ALLOCA(tmp_buf, file::iovec_t, bufs.size());
|
||||||
|
|
||||||
|
@ -1188,7 +1188,7 @@ namespace libtorrent
|
||||||
bytes_left -= bytes_transferred;
|
bytes_left -= bytes_transferred;
|
||||||
file_offset += bytes_transferred;
|
file_offset += bytes_transferred;
|
||||||
|
|
||||||
TORRENT_ASSERT(count_bufs(current_buf, bytes_left) <= bufs.size());
|
TORRENT_ASSERT(count_bufs(current_buf, bytes_left) <= int(bufs.size()));
|
||||||
|
|
||||||
// if the file operation returned 0, we've hit end-of-file. We're done
|
// if the file operation returned 0, we've hit end-of-file. We're done
|
||||||
if (bytes_transferred == 0)
|
if (bytes_transferred == 0)
|
||||||
|
|
|
@ -206,7 +206,7 @@ namespace libtorrent
|
||||||
// the number of dots we've added
|
// the number of dots we've added
|
||||||
char num_dots = 0;
|
char num_dots = 0;
|
||||||
bool found_extension = false;
|
bool found_extension = false;
|
||||||
for (int i = 0; i < element.size(); ++i)
|
for (std::size_t i = 0; i < element.size(); ++i)
|
||||||
{
|
{
|
||||||
if (element[i] == '/'
|
if (element[i] == '/'
|
||||||
|| element[i] == '\\'
|
|| element[i] == '\\'
|
||||||
|
@ -251,7 +251,7 @@ namespace libtorrent
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
path += element[i];
|
path += element[i];
|
||||||
path += element[i+1];
|
path += element[i + 1];
|
||||||
last_len = 2;
|
last_len = 2;
|
||||||
}
|
}
|
||||||
i += 1;
|
i += 1;
|
||||||
|
@ -276,8 +276,8 @@ namespace libtorrent
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
path += element[i];
|
path += element[i];
|
||||||
path += element[i+1];
|
path += element[i + 1];
|
||||||
path += element[i+2];
|
path += element[i + 2];
|
||||||
last_len = 3;
|
last_len = 3;
|
||||||
}
|
}
|
||||||
i += 2;
|
i += 2;
|
||||||
|
@ -286,16 +286,16 @@ namespace libtorrent
|
||||||
{
|
{
|
||||||
// 4 bytes
|
// 4 bytes
|
||||||
if (element.size() - i < 4
|
if (element.size() - i < 4
|
||||||
|| (element[i+1] & 0xc0) != 0x80
|
|| (element[i + 1] & 0xc0) != 0x80
|
||||||
|| (element[i+2] & 0xc0) != 0x80
|
|| (element[i + 2] & 0xc0) != 0x80
|
||||||
|| (element[i+3] & 0xc0) != 0x80
|
|| (element[i + 3] & 0xc0) != 0x80
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
path += '_';
|
path += '_';
|
||||||
last_len = 1;
|
last_len = 1;
|
||||||
}
|
}
|
||||||
else if ((element[i] & 0x07) == 0
|
else if ((element[i] & 0x07) == 0
|
||||||
&& (element[i+1] & 0x3f) == 0)
|
&& (element[i + 1] & 0x3f) == 0)
|
||||||
{
|
{
|
||||||
// overlong sequences are invalid
|
// overlong sequences are invalid
|
||||||
path += '_';
|
path += '_';
|
||||||
|
@ -304,9 +304,9 @@ namespace libtorrent
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
path += element[i];
|
path += element[i];
|
||||||
path += element[i+1];
|
path += element[i + 1];
|
||||||
path += element[i+2];
|
path += element[i + 2];
|
||||||
path += element[i+3];
|
path += element[i + 3];
|
||||||
last_len = 4;
|
last_len = 4;
|
||||||
}
|
}
|
||||||
i += 3;
|
i += 3;
|
||||||
|
@ -331,8 +331,8 @@ namespace libtorrent
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
int dot = -1;
|
int dot = -1;
|
||||||
for (int j = int(element.size())-1;
|
for (int j = int(element.size()) - 1;
|
||||||
j > (std::max)(int(element.size() - 10), i); --j)
|
j > std::max(int(element.size()) - 10, int(i)); --j)
|
||||||
{
|
{
|
||||||
if (element[j] != '.') continue;
|
if (element[j] != '.') continue;
|
||||||
dot = j;
|
dot = j;
|
||||||
|
@ -341,14 +341,15 @@ namespace libtorrent
|
||||||
// there is no extension
|
// there is no extension
|
||||||
if (dot == -1) break;
|
if (dot == -1) break;
|
||||||
found_extension = true;
|
found_extension = true;
|
||||||
i = dot - 1;
|
TORRENT_ASSERT(dot > 0);
|
||||||
|
i = std::size_t(dot - 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (added == num_dots && added <= 2)
|
if (added == num_dots && added <= 2)
|
||||||
{
|
{
|
||||||
// revert everything
|
// revert everything
|
||||||
path.erase(path.end()-added-added_separator, path.end());
|
path.erase(path.end() - added - added_separator, path.end());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -365,7 +366,7 @@ namespace libtorrent
|
||||||
if (added == 0 && added_separator)
|
if (added == 0 && added_separator)
|
||||||
{
|
{
|
||||||
// remove the separator added at the beginning
|
// remove the separator added at the beginning
|
||||||
path.erase(path.end()-1);
|
path.erase(path.end() - 1);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -528,7 +529,7 @@ namespace libtorrent
|
||||||
file_flags &= ~file_storage::flag_symlink;
|
file_flags &= ~file_storage::flag_symlink;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (filename_len > path.length()
|
if (filename_len > int(path.length())
|
||||||
|| path.compare(path.size() - filename_len, filename_len, filename
|
|| path.compare(path.size() - filename_len, filename_len, filename
|
||||||
, filename_len) != 0)
|
, filename_len) != 0)
|
||||||
{
|
{
|
||||||
|
@ -666,11 +667,11 @@ namespace libtorrent
|
||||||
const_cast<file_storage&>(*m_orig_files).apply_pointer_offset(offset);
|
const_cast<file_storage&>(*m_orig_files).apply_pointer_offset(offset);
|
||||||
|
|
||||||
#ifndef TORRENT_DISABLE_MUTABLE_TORRENTS
|
#ifndef TORRENT_DISABLE_MUTABLE_TORRENTS
|
||||||
for (int i = 0; i < m_collections.size(); ++i)
|
for (auto& c : m_collections)
|
||||||
m_collections[i].first += offset;
|
c.first += offset;
|
||||||
|
|
||||||
for (int i = 0; i < m_similar_torrents.size(); ++i)
|
for (auto& st : m_similar_torrents)
|
||||||
m_similar_torrents[i] += offset;
|
st += offset;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (m_info_dict)
|
if (m_info_dict)
|
||||||
|
@ -1615,11 +1616,11 @@ namespace libtorrent
|
||||||
#ifndef TORRENT_DISABLE_MUTABLE_TORRENTS
|
#ifndef TORRENT_DISABLE_MUTABLE_TORRENTS
|
||||||
ret.reserve(m_similar_torrents.size() + m_owned_similar_torrents.size());
|
ret.reserve(m_similar_torrents.size() + m_owned_similar_torrents.size());
|
||||||
|
|
||||||
for (int i = 0; i < m_similar_torrents.size(); ++i)
|
for (auto const& st : m_similar_torrents)
|
||||||
ret.push_back(sha1_hash(m_similar_torrents[i]));
|
ret.push_back(sha1_hash(st));
|
||||||
|
|
||||||
for (int i = 0; i < m_owned_similar_torrents.size(); ++i)
|
for (auto const& st : m_owned_similar_torrents)
|
||||||
ret.push_back(m_owned_similar_torrents[i]);
|
ret.push_back(st);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -1631,11 +1632,11 @@ namespace libtorrent
|
||||||
#ifndef TORRENT_DISABLE_MUTABLE_TORRENTS
|
#ifndef TORRENT_DISABLE_MUTABLE_TORRENTS
|
||||||
ret.reserve(m_collections.size() + m_owned_collections.size());
|
ret.reserve(m_collections.size() + m_owned_collections.size());
|
||||||
|
|
||||||
for (int i = 0; i < m_collections.size(); ++i)
|
for (auto const& c : m_collections)
|
||||||
ret.push_back(std::string(m_collections[i].first, m_collections[i].second));
|
ret.push_back(std::string(c.first, c.second));
|
||||||
|
|
||||||
for (int i = 0; i < m_owned_collections.size(); ++i)
|
for (auto const& c : m_owned_collections)
|
||||||
ret.push_back(m_owned_collections[i]);
|
ret.push_back(c);
|
||||||
#endif // TORRENT_DISABLE_MUTABLE_TORRENTS
|
#endif // TORRENT_DISABLE_MUTABLE_TORRENTS
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -387,7 +387,7 @@ void web_peer_connection::write_request(peer_request const& r)
|
||||||
file_request_t file_req;
|
file_request_t file_req;
|
||||||
file_req.file_index = f.file_index;
|
file_req.file_index = f.file_index;
|
||||||
file_req.start = f.offset;
|
file_req.start = f.offset;
|
||||||
file_req.length = f.size;
|
file_req.length = int(f.size);
|
||||||
|
|
||||||
if (info.orig_files().pad_file_at(f.file_index))
|
if (info.orig_files().pad_file_at(f.file_index))
|
||||||
{
|
{
|
||||||
|
@ -542,7 +542,7 @@ bool web_peer_connection::received_invalid_data(int index, bool single_peer)
|
||||||
// assume the web seed has a different copy of this specific file
|
// assume the web seed has a different copy of this specific file
|
||||||
// than what we expect, and pretend not to have it.
|
// than what we expect, and pretend not to have it.
|
||||||
int fi = files[0].file_index;
|
int fi = files[0].file_index;
|
||||||
int first_piece = fs.file_offset(fi) / fs.piece_length();
|
int first_piece = int(fs.file_offset(fi) / fs.piece_length());
|
||||||
// one past last piece
|
// one past last piece
|
||||||
int end_piece = int((fs.file_offset(fi) + fs.file_size(fi) + 1) / fs.piece_length());
|
int end_piece = int((fs.file_offset(fi) + fs.file_size(fi) + 1) / fs.piece_length());
|
||||||
for (int i = first_piece; i < end_piece; ++i)
|
for (int i = first_piece; i < end_piece; ++i)
|
||||||
|
@ -744,7 +744,7 @@ void web_peer_connection::on_receive(error_code const& error
|
||||||
}
|
}
|
||||||
|
|
||||||
TORRENT_ASSERT(recv_buffer.empty() || recv_buffer[0] == 'H');
|
TORRENT_ASSERT(recv_buffer.empty() || recv_buffer[0] == 'H');
|
||||||
TORRENT_ASSERT(recv_buffer.size() <= m_recv_buffer.packet_size());
|
TORRENT_ASSERT(int(recv_buffer.size()) <= m_recv_buffer.packet_size());
|
||||||
|
|
||||||
// this means the entire status line hasn't been received yet
|
// this means the entire status line hasn't been received yet
|
||||||
if (m_parser.status_code() == -1)
|
if (m_parser.status_code() == -1)
|
||||||
|
@ -915,7 +915,7 @@ void web_peer_connection::on_receive(error_code const& error
|
||||||
received_bytes(0, header_size - m_partial_chunk_header);
|
received_bytes(0, header_size - m_partial_chunk_header);
|
||||||
m_partial_chunk_header = 0;
|
m_partial_chunk_header = 0;
|
||||||
TORRENT_ASSERT(chunk_size != 0
|
TORRENT_ASSERT(chunk_size != 0
|
||||||
|| chunk_start.size() <= header_size || chunk_start[header_size] == 'H');
|
|| int(chunk_start.size()) <= header_size || chunk_start[header_size] == 'H');
|
||||||
TORRENT_ASSERT(m_body_start + m_chunk_pos < INT_MAX);
|
TORRENT_ASSERT(m_body_start + m_chunk_pos < INT_MAX);
|
||||||
m_chunk_pos += chunk_size;
|
m_chunk_pos += chunk_size;
|
||||||
recv_buffer = recv_buffer.subspan(header_size);
|
recv_buffer = recv_buffer.subspan(header_size);
|
||||||
|
@ -1141,9 +1141,9 @@ void web_peer_connection::handle_padfile()
|
||||||
while (file_size > 0)
|
while (file_size > 0)
|
||||||
{
|
{
|
||||||
peer_request const front_request = m_requests.front();
|
peer_request const front_request = m_requests.front();
|
||||||
TORRENT_ASSERT(m_piece.size() < front_request.length);
|
TORRENT_ASSERT(int(m_piece.size()) < front_request.length);
|
||||||
|
|
||||||
int pad_size = int((std::min)(file_size
|
int pad_size = int(std::min(file_size
|
||||||
, std::int64_t(front_request.length - m_piece.size())));
|
, std::int64_t(front_request.length - m_piece.size())));
|
||||||
TORRENT_ASSERT(pad_size > 0);
|
TORRENT_ASSERT(pad_size > 0);
|
||||||
file_size -= pad_size;
|
file_size -= pad_size;
|
||||||
|
|
|
@ -115,7 +115,7 @@ alert* wait_for_alert(lt::session& s, int alert_type)
|
||||||
}
|
}
|
||||||
|
|
||||||
void put_string(entry& e, std::array<char, 64>& sig
|
void put_string(entry& e, std::array<char, 64>& sig
|
||||||
, std::uint64_t& seq
|
, std::int64_t& seq
|
||||||
, std::string const& salt
|
, std::string const& salt
|
||||||
, std::array<char, 32> const& pk
|
, std::array<char, 32> const& pk
|
||||||
, std::array<char, 64> const& sk
|
, std::array<char, 64> const& sk
|
||||||
|
@ -411,4 +411,3 @@ int main(int argc, char* argv[])
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue