Re-implemented dht_get_peers_reply_alert using the stack_allocator for peers vector storage.
This commit is contained in:
parent
cbba63ce94
commit
d9246d12c4
|
@ -2362,13 +2362,20 @@ namespace libtorrent
|
|||
, sha1_hash const& ih
|
||||
, std::vector<tcp::endpoint> const& v);
|
||||
|
||||
const static int static_category = alert::dht_operation_notification;
|
||||
static const int static_category = alert::dht_operation_notification;
|
||||
TORRENT_DEFINE_ALERT(dht_get_peers_reply_alert, 87)
|
||||
|
||||
virtual std::string message() const;
|
||||
|
||||
sha1_hash info_hash;
|
||||
std::vector<tcp::endpoint> peers;
|
||||
|
||||
int num_peers() const;
|
||||
tcp::endpoint get_peer(int index) const;
|
||||
|
||||
private:
|
||||
aux::stack_allocator& m_alloc;
|
||||
int m_num_peers;
|
||||
int m_peers_idx; // coded like a pair of (index to actual endpoint bytes, size of endpoint)
|
||||
};
|
||||
|
||||
#undef TORRENT_DEFINE_ALERT_IMPL
|
||||
|
|
|
@ -1777,20 +1777,55 @@ namespace libtorrent {
|
|||
return buf;
|
||||
}
|
||||
|
||||
dht_get_peers_reply_alert::dht_get_peers_reply_alert(aux::stack_allocator&
|
||||
dht_get_peers_reply_alert::dht_get_peers_reply_alert(aux::stack_allocator& alloc
|
||||
, sha1_hash const& ih
|
||||
, std::vector<tcp::endpoint> const& v)
|
||||
: info_hash(ih), peers(v)
|
||||
{}
|
||||
, std::vector<tcp::endpoint> const& peers)
|
||||
: m_alloc(alloc)
|
||||
, info_hash(ih)
|
||||
, m_num_peers(peers.size())
|
||||
, m_peers_idx(alloc.allocate(sizeof(int) * peers.size() * 2))
|
||||
{
|
||||
for (int i = 0; i < m_num_peers; i++) {
|
||||
tcp::endpoint endp = peers[i];
|
||||
int size = endp.size();
|
||||
int idx = alloc.copy_buffer((char*)endp.data(), size);
|
||||
memcpy(alloc.ptr(sizeof(int) * (2 * i)) , (void*)&idx , sizeof(int));
|
||||
memcpy(alloc.ptr(sizeof(int) * (2 * i + 1)), (void*)&size, sizeof(int));
|
||||
}
|
||||
}
|
||||
|
||||
std::string dht_get_peers_reply_alert::message() const
|
||||
{
|
||||
char ih_hex[41];
|
||||
to_hex((const char*)&info_hash[0], 20, ih_hex);
|
||||
char msg[200];
|
||||
snprintf(msg, sizeof(msg), "incoming dht get_peers reply: %s, peers %ld", ih_hex, peers.size());
|
||||
snprintf(msg, sizeof(msg), "incoming dht get_peers reply: %s, peers %ld", ih_hex, m_num_peers);
|
||||
return msg;
|
||||
}
|
||||
|
||||
int dht_get_peers_reply_alert::num_peers() const
|
||||
{
|
||||
return m_num_peers;
|
||||
}
|
||||
|
||||
tcp::endpoint dht_get_peers_reply_alert::get_peer(int index) const
|
||||
{
|
||||
int idx, size;
|
||||
memcpy((void*)&idx , m_alloc.ptr(sizeof(int) * (2 * index)) , sizeof(int));
|
||||
memcpy((void*)&size, m_alloc.ptr(sizeof(int) * (2 * index + 1)), sizeof(int));
|
||||
|
||||
tcp::endpoint endp;
|
||||
|
||||
if (size == sizeof(boost::asio::detail::sockaddr_in6_type))
|
||||
{
|
||||
endp.resize(sizeof(boost::asio::detail::sockaddr_in6_type));
|
||||
}
|
||||
|
||||
memcpy((void*)endp.data(), m_alloc.ptr(idx), size);
|
||||
|
||||
|
||||
return endp;
|
||||
}
|
||||
|
||||
} // namespace libtorrent
|
||||
|
||||
|
|
Loading…
Reference in New Issue