diff --git a/include/libtorrent/kademlia/node_id.hpp b/include/libtorrent/kademlia/node_id.hpp index 5bd2aa46c..a78b7f8fc 100644 --- a/include/libtorrent/kademlia/node_id.hpp +++ b/include/libtorrent/kademlia/node_id.hpp @@ -58,6 +58,7 @@ int TORRENT_EXTRA_EXPORT distance_exp(node_id const& n1, node_id const& n2); node_id TORRENT_EXTRA_EXPORT generate_id(address const& external_ip); node_id TORRENT_EXTRA_EXPORT generate_random_id(); +node_id TORRENT_EXTRA_EXPORT generate_id_impl(address const& ip_, boost::uint32_t r); bool TORRENT_EXTRA_EXPORT verify_id(node_id const& nid, address const& source_ip); diff --git a/src/connection_queue.cpp b/src/connection_queue.cpp index abc59c8c9..c141a8893 100644 --- a/src/connection_queue.cpp +++ b/src/connection_queue.cpp @@ -156,7 +156,8 @@ namespace libtorrent continue; } TORRENT_TRY { - e.on_connect(-1); + if (e.connecting) e.on_timeout(); + else e.on_connect(-1); } TORRENT_CATCH(std::exception&) {} tmp.pop_front(); } diff --git a/src/piece_picker.cpp b/src/piece_picker.cpp index bbfbcb9d1..847b9b7b9 100644 --- a/src/piece_picker.cpp +++ b/src/piece_picker.cpp @@ -989,7 +989,7 @@ namespace libtorrent #ifdef TORRENT_EXPENSIVE_INVARIANT_CHECKS TORRENT_PIECE_PICKER_INVARIANT_CHECK; #endif - TORRENT_ASSERT(bitmask.size() == m_piece_map.size()); + TORRENT_ASSERT(bitmask.size() <= m_piece_map.size()); int index = 0; bool updated = false; diff --git a/src/torrent.cpp b/src/torrent.cpp index be3aa2176..b70c4b063 100644 --- a/src/torrent.cpp +++ b/src/torrent.cpp @@ -4842,6 +4842,8 @@ namespace libtorrent c->start(); + if (c->is_disconnecting()) return; + m_ses.m_half_open.enqueue( boost::bind(&peer_connection::on_connect, c, _1) , boost::bind(&peer_connection::on_timeout, c) diff --git a/src/udp_socket.cpp b/src/udp_socket.cpp index 95cdd8b79..a481173c8 100644 --- a/src/udp_socket.cpp +++ b/src/udp_socket.cpp @@ -856,16 +856,30 @@ void udp_socket::on_connect(int ticket) + m_outstanding_resolve + m_outstanding_connect_queue + m_outstanding_socks); + CHECK_MAGIC; - if (m_abort) return; - if (is_closed()) return; if (ticket == -1) { +#if defined TORRENT_DEBUG || TORRENT_RELEASE_ASSERTS + TORRENT_ASSERT(m_outstanding_timeout > 0); + --m_outstanding_timeout; +#endif + TORRENT_ASSERT(m_outstanding_ops > 0); + --m_outstanding_ops; + TORRENT_ASSERT(m_outstanding_ops == m_outstanding_connect + + m_outstanding_timeout + + m_outstanding_resolve + + m_outstanding_connect_queue + + m_outstanding_socks); close(); return; } + + if (m_abort) return; + if (is_closed()) return; + #if defined TORRENT_ASIO_DEBUGGING add_outstanding_async("udp_socket::on_connected"); #endif