forked from premiere/premiere-libtorrent
fix frequent dealloc/alloc for utp socket lists (#1496)
fix frequent dealloc/alloc for utp socket lists
This commit is contained in:
parent
ba995fef84
commit
224db08997
|
@ -130,23 +130,29 @@ namespace libtorrent
|
||||||
typedef std::multimap<std::uint16_t, utp_socket_impl*> socket_map_t;
|
typedef std::multimap<std::uint16_t, utp_socket_impl*> socket_map_t;
|
||||||
socket_map_t m_utp_sockets;
|
socket_map_t m_utp_sockets;
|
||||||
|
|
||||||
|
using socket_vector_t = std::vector<utp_socket_impl*>;
|
||||||
|
|
||||||
// this is a list of sockets that needs to send an ack.
|
// this is a list of sockets that needs to send an ack.
|
||||||
// once the UDP socket is drained, all of these will
|
// once the UDP socket is drained, all of these will
|
||||||
// have a chance to do that. This is to avoid sending
|
// have a chance to do that. This is to avoid sending
|
||||||
// an ack for every single packet
|
// an ack for every single packet
|
||||||
std::vector<utp_socket_impl*> m_deferred_acks;
|
socket_vector_t m_deferred_acks;
|
||||||
|
|
||||||
|
// storage used for saving cpu time on "push_back"
|
||||||
|
// by using already pre-allocated vector
|
||||||
|
socket_vector_t m_temp_sockets;
|
||||||
|
|
||||||
// sockets that have received or sent packets this
|
// sockets that have received or sent packets this
|
||||||
// round, may subscribe to the event of draining the
|
// round, may subscribe to the event of draining the
|
||||||
// UDP socket. At that point they may call the
|
// UDP socket. At that point they may call the
|
||||||
// user callback function to indicate bytes have been
|
// user callback function to indicate bytes have been
|
||||||
// sent or received.
|
// sent or received.
|
||||||
std::vector<utp_socket_impl*> m_drained_event;
|
socket_vector_t m_drained_event;
|
||||||
|
|
||||||
// list of sockets that received EWOULDBLOCK from the
|
// list of sockets that received EWOULDBLOCK from the
|
||||||
// underlying socket. They are notified when the socket
|
// underlying socket. They are notified when the socket
|
||||||
// becomes writable again
|
// becomes writable again
|
||||||
std::vector<utp_socket_impl*> m_stalled_sockets;
|
socket_vector_t m_stalled_sockets;
|
||||||
|
|
||||||
// the last socket we received a packet on
|
// the last socket we received a packet on
|
||||||
utp_socket_impl* m_last_socket = nullptr;
|
utp_socket_impl* m_last_socket = nullptr;
|
||||||
|
|
|
@ -255,13 +255,14 @@ namespace libtorrent
|
||||||
|
|
||||||
void utp_socket_manager::writable()
|
void utp_socket_manager::writable()
|
||||||
{
|
{
|
||||||
std::vector<utp_socket_impl*> stalled_sockets;
|
if (!m_stalled_sockets.empty())
|
||||||
m_stalled_sockets.swap(stalled_sockets);
|
|
||||||
for (std::vector<utp_socket_impl*>::iterator i = stalled_sockets.begin()
|
|
||||||
, end(stalled_sockets.end()); i != end; ++i)
|
|
||||||
{
|
{
|
||||||
utp_socket_impl* s = *i;
|
m_temp_sockets.clear();
|
||||||
utp_writable(s);
|
m_stalled_sockets.swap(m_temp_sockets);
|
||||||
|
for (auto const &s : m_temp_sockets)
|
||||||
|
{
|
||||||
|
utp_writable(s);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -269,22 +270,24 @@ namespace libtorrent
|
||||||
{
|
{
|
||||||
// flush all deferred acks
|
// flush all deferred acks
|
||||||
|
|
||||||
std::vector<utp_socket_impl*> deferred_acks;
|
if (!m_deferred_acks.empty())
|
||||||
m_deferred_acks.swap(deferred_acks);
|
|
||||||
for (std::vector<utp_socket_impl*>::iterator i = deferred_acks.begin()
|
|
||||||
, end(deferred_acks.end()); i != end; ++i)
|
|
||||||
{
|
{
|
||||||
utp_socket_impl* s = *i;
|
m_temp_sockets.clear();
|
||||||
utp_send_ack(s);
|
m_deferred_acks.swap(m_temp_sockets);
|
||||||
|
for (auto const &s : m_temp_sockets)
|
||||||
|
{
|
||||||
|
utp_send_ack(s);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<utp_socket_impl*> drained_event;
|
if (!m_drained_event.empty())
|
||||||
m_drained_event.swap(drained_event);
|
|
||||||
for (std::vector<utp_socket_impl*>::iterator i = drained_event.begin()
|
|
||||||
, end(drained_event.end()); i != end; ++i)
|
|
||||||
{
|
{
|
||||||
utp_socket_impl* s = *i;
|
m_temp_sockets.clear();
|
||||||
utp_socket_drained(s);
|
m_drained_event.swap(m_temp_sockets);
|
||||||
|
for (auto const &s : m_temp_sockets)
|
||||||
|
{
|
||||||
|
utp_socket_drained(s);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue