merged utp_socket_manager optimization from libtorrent_aio

This commit is contained in:
Arvid Norberg 2012-11-12 09:49:00 +00:00
parent 58d5b9aedc
commit 5b26d5d962
3 changed files with 15 additions and 4 deletions

View File

@ -1033,6 +1033,7 @@ namespace libtorrent
}; };
// this list is sorted by time_critical_piece::deadline // this list is sorted by time_critical_piece::deadline
// TODO: this should be a deque
std::list<time_critical_piece> m_time_critical_pieces; std::list<time_critical_piece> m_time_critical_pieces;
std::string m_trackerid; std::string m_trackerid;

View File

@ -128,6 +128,10 @@ namespace libtorrent
// the routing table // the routing table
mutable ptime m_last_route_update; mutable ptime m_last_route_update;
// cache of interfaces
mutable std::vector<ip_interface> m_interfaces;
mutable ptime m_last_if_update;
// the buffer size of the socket. This is used // the buffer size of the socket. This is used
// to now lower the buffer size // to now lower the buffer size
int m_sock_buf_size; int m_sock_buf_size;

View File

@ -51,6 +51,7 @@ namespace libtorrent
, m_new_connection(-1) , m_new_connection(-1)
, m_sett(sett) , m_sett(sett)
, m_last_route_update(min_time()) , m_last_route_update(min_time())
, m_last_if_update(min_time())
, m_sock_buf_size(0) , m_sock_buf_size(0)
{} {}
@ -235,11 +236,16 @@ namespace libtorrent
// for this target. Now figure out what the local address // for this target. Now figure out what the local address
// is for that interface // is for that interface
std::vector<ip_interface> net = enum_net_interfaces(m_sock.get_io_service(), ec); if (time_now() - m_last_if_update > seconds(60))
{
m_last_if_update = time_now();
error_code ec;
m_interfaces = enum_net_interfaces(m_sock.get_io_service(), ec);
if (ec) return socket_ep; if (ec) return socket_ep;
}
for (std::vector<ip_interface>::iterator i = net.begin() for (std::vector<ip_interface>::iterator i = m_interfaces.begin()
, end(net.end()); i != end; ++i) , end(m_interfaces.end()); i != end; ++i)
{ {
if (i->interface_address.is_v4() != remote.is_v4()) if (i->interface_address.is_v4() != remote.is_v4())
continue; continue;