forked from premiere/premiere-libtorrent
reserve space for m_peers_to_disconnect up front, in order to make queing up a peer for disconnection noexcept
This commit is contained in:
parent
ab9fcdf029
commit
6ba64a1bb3
|
@ -5413,6 +5413,8 @@ namespace libtorrent {
|
||||||
if (p->associated_torrent().lock().get() == this)
|
if (p->associated_torrent().lock().get() == this)
|
||||||
{
|
{
|
||||||
std::weak_ptr<torrent> weak_t = shared_from_this();
|
std::weak_ptr<torrent> weak_t = shared_from_this();
|
||||||
|
TORRENT_ASSERT_VAL(m_peers_to_disconnect.capacity() > m_peers_to_disconnect.size()
|
||||||
|
, m_peers_to_disconnect.capacity());
|
||||||
m_peers_to_disconnect.push_back(p);
|
m_peers_to_disconnect.push_back(p);
|
||||||
m_deferred_disconnect.post(m_ses.get_io_service(), aux::make_handler([=]()
|
m_deferred_disconnect.post(m_ses.get_io_service(), aux::make_handler([=]()
|
||||||
{
|
{
|
||||||
|
@ -5492,9 +5494,10 @@ namespace libtorrent {
|
||||||
TORRENT_ASSERT(is_single_thread());
|
TORRENT_ASSERT(is_single_thread());
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
|
|
||||||
std::vector<std::shared_ptr<peer_connection>> peers;
|
#if TORRENT_USE_ASSERTS
|
||||||
m_peers_to_disconnect.swap(peers);
|
auto const num = m_peers_to_disconnect.size();
|
||||||
for (auto const& p : peers)
|
#endif
|
||||||
|
for (auto const& p : m_peers_to_disconnect)
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(p);
|
TORRENT_ASSERT(p);
|
||||||
TORRENT_ASSERT(p->associated_torrent().lock().get() == this);
|
TORRENT_ASSERT(p->associated_torrent().lock().get() == this);
|
||||||
|
@ -5502,6 +5505,8 @@ namespace libtorrent {
|
||||||
remove_connection(p.get());
|
remove_connection(p.get());
|
||||||
m_ses.close_connection(p.get());
|
m_ses.close_connection(p.get());
|
||||||
}
|
}
|
||||||
|
TORRENT_ASSERT_VAL(m_peers_to_disconnect.size() == num, m_peers_to_disconnect.size() - num);
|
||||||
|
m_peers_to_disconnect.clear();
|
||||||
|
|
||||||
if (m_graceful_pause_mode && m_connections.empty())
|
if (m_graceful_pause_mode && m_connections.empty())
|
||||||
{
|
{
|
||||||
|
@ -5992,6 +5997,12 @@ namespace libtorrent {
|
||||||
TORRENT_ASSERT(!c->m_in_constructor);
|
TORRENT_ASSERT(!c->m_in_constructor);
|
||||||
// add the newly connected peer to this torrent's peer list
|
// add the newly connected peer to this torrent's peer list
|
||||||
TORRENT_ASSERT(m_iterating_connections == 0);
|
TORRENT_ASSERT(m_iterating_connections == 0);
|
||||||
|
|
||||||
|
// we don't want to have to allocate memory to disconnect this peer, so
|
||||||
|
// make sure there's enough memory allocated in the deferred_disconnect
|
||||||
|
// list up-front
|
||||||
|
m_peers_to_disconnect.reserve(m_connections.size() + 1);
|
||||||
|
|
||||||
sorted_insert(m_connections, c.get());
|
sorted_insert(m_connections, c.get());
|
||||||
update_want_peers();
|
update_want_peers();
|
||||||
update_want_tick();
|
update_want_tick();
|
||||||
|
@ -6586,6 +6597,12 @@ namespace libtorrent {
|
||||||
|
|
||||||
// add the newly connected peer to this torrent's peer list
|
// add the newly connected peer to this torrent's peer list
|
||||||
TORRENT_ASSERT(m_iterating_connections == 0);
|
TORRENT_ASSERT(m_iterating_connections == 0);
|
||||||
|
|
||||||
|
// we don't want to have to allocate memory to disconnect this peer, so
|
||||||
|
// make sure there's enough memory allocated in the deferred_disconnect
|
||||||
|
// list up-front
|
||||||
|
m_peers_to_disconnect.reserve(m_connections.size() + 1);
|
||||||
|
|
||||||
sorted_insert(m_connections, c.get());
|
sorted_insert(m_connections, c.get());
|
||||||
m_ses.insert_peer(c);
|
m_ses.insert_peer(c);
|
||||||
need_peer_list();
|
need_peer_list();
|
||||||
|
@ -6872,6 +6889,8 @@ namespace libtorrent {
|
||||||
}
|
}
|
||||||
peers_erased(st.erased);
|
peers_erased(st.erased);
|
||||||
|
|
||||||
|
m_peers_to_disconnect.reserve(m_connections.size() + 1);
|
||||||
|
|
||||||
TORRENT_ASSERT(sorted_find(m_connections, p) == m_connections.end());
|
TORRENT_ASSERT(sorted_find(m_connections, p) == m_connections.end());
|
||||||
TORRENT_ASSERT(m_iterating_connections == 0);
|
TORRENT_ASSERT(m_iterating_connections == 0);
|
||||||
sorted_insert(m_connections, p);
|
sorted_insert(m_connections, p);
|
||||||
|
|
Loading…
Reference in New Issue