clean up logic around waiting for disk write queue to fall below low watermark. optimize peer disconnect. Fix integer overflow bug in uTP/TCP mixed mode algorithm. Fixed some invariant checks for closing connections issues
This commit is contained in:
parent
41806e2e07
commit
b230c385d9
|
@ -601,6 +601,10 @@ namespace libtorrent
|
|||
size_type downloaded_since_unchoke() const
|
||||
{ return m_statistics.total_payload_download() - m_downloaded_at_last_unchoke; }
|
||||
|
||||
// called when the disk write buffer is drained again, and we can
|
||||
// start downloading payload again
|
||||
void on_disk();
|
||||
|
||||
enum sync_t { read_async, read_sync };
|
||||
void setup_receive(sync_t sync = read_sync);
|
||||
|
||||
|
|
|
@ -4524,12 +4524,20 @@ namespace libtorrent
|
|||
m_channel_state[upload_channel] = peer_info::bw_network;
|
||||
}
|
||||
|
||||
void peer_connection::on_disk()
|
||||
{
|
||||
if (m_channel_state[download_channel] != peer_info::bw_disk) return;
|
||||
boost::intrusive_ptr<peer_connection> me(this);
|
||||
|
||||
m_channel_state[download_channel] = peer_info::bw_idle;
|
||||
setup_receive();
|
||||
}
|
||||
|
||||
void peer_connection::setup_receive(sync_t sync)
|
||||
{
|
||||
INVARIANT_CHECK;
|
||||
|
||||
if (m_channel_state[download_channel] != peer_info::bw_idle
|
||||
&& m_channel_state[download_channel] != peer_info::bw_disk) return;
|
||||
if (m_channel_state[download_channel] != peer_info::bw_idle) return;
|
||||
|
||||
shared_ptr<torrent> t = m_torrent.lock();
|
||||
|
||||
|
@ -4864,6 +4872,13 @@ namespace libtorrent
|
|||
, std::size_t bytes_transferred)
|
||||
{
|
||||
TORRENT_ASSERT(m_ses.is_network_thread());
|
||||
|
||||
// keep ourselves alive in until this function exits in
|
||||
// case we disconnect
|
||||
// this needs to be created before the invariant check,
|
||||
// to keep the object alive through the exit check
|
||||
boost::intrusive_ptr<peer_connection> me(self());
|
||||
|
||||
INVARIANT_CHECK;
|
||||
|
||||
#ifdef TORRENT_VERBOSE_LOGGING
|
||||
|
@ -4873,10 +4888,6 @@ namespace libtorrent
|
|||
#if defined TORRENT_ASIO_DEBUGGING
|
||||
complete_async("peer_connection::on_receive_data");
|
||||
#endif
|
||||
// keep ourselves alive in until this function exits in
|
||||
// case we disconnect
|
||||
boost::intrusive_ptr<peer_connection> me(self());
|
||||
|
||||
TORRENT_ASSERT(m_channel_state[download_channel] == peer_info::bw_network);
|
||||
m_channel_state[download_channel] = peer_info::bw_idle;
|
||||
|
||||
|
|
|
@ -2217,11 +2217,10 @@ namespace aux {
|
|||
TORRENT_ASSERT(p->is_disconnecting());
|
||||
|
||||
if (!p->is_choked() && !p->ignore_unchoke_slots()) --m_num_unchoked;
|
||||
// connection_map::iterator i = std::lower_bound(m_connections.begin(), m_connections.end()
|
||||
// , p, boost::bind(&boost::intrusive_ptr<peer_connection>::get, _1) < p);
|
||||
// if (i->get() != p) i == m_connections.end();
|
||||
connection_map::iterator i = std::find_if(m_connections.begin(), m_connections.end()
|
||||
, boost::bind(&boost::intrusive_ptr<peer_connection>::get, _1) == p);
|
||||
TORRENT_ASSERT(p->refcount() > 0);
|
||||
|
||||
boost::intrusive_ptr<peer_connection> sp((peer_connection*)p);
|
||||
connection_map::iterator i = m_connections.find(sp);
|
||||
if (i != m_connections.end()) m_connections.erase(i);
|
||||
}
|
||||
|
||||
|
@ -2295,7 +2294,7 @@ namespace aux {
|
|||
{
|
||||
// setup_receive() may disconnect the connection
|
||||
// and clear it out from the m_connections list
|
||||
(*i)->setup_receive();
|
||||
(*i)->on_disk();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2427,8 +2426,10 @@ namespace aux {
|
|||
else
|
||||
{
|
||||
if (num_tcp_peers == 0) num_tcp_peers = 1;
|
||||
int upload_rate = (std::max)(m_stat.upload_rate(), 20000);
|
||||
int download_rate = (std::max)(m_stat.download_rate(), 20000);
|
||||
// these are 64 bits since they are multiplied by the number
|
||||
// of peers, which otherwise might overflow an int
|
||||
boost::uint64_t upload_rate = (std::max)(m_stat.upload_rate(), 20000);
|
||||
boost::uint64_t download_rate = (std::max)(m_stat.download_rate(), 20000);
|
||||
if (m_upload_channel.throttle()) upload_rate = m_upload_channel.throttle();
|
||||
if (m_download_channel.throttle()) download_rate = m_download_channel.throttle();
|
||||
|
||||
|
@ -4316,8 +4317,6 @@ namespace aux {
|
|||
|
||||
void session_impl::update_connections_limit()
|
||||
{
|
||||
INVARIANT_CHECK;
|
||||
|
||||
if (m_settings.connections_limit <= 0)
|
||||
{
|
||||
m_settings.connections_limit = (std::numeric_limits<int>::max)();
|
||||
|
|
Loading…
Reference in New Issue