diff --git a/ChangeLog b/ChangeLog index d3b54f9ae..f94b847dc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -60,6 +60,7 @@ release 0.14.5 * fixed bug when handling malformed webseed urls and an http proxy * fixed bug when setting unlimited upload or download rates for torrents + * fix to make torrent_status::list_peers more accurate. release 0.14.4 diff --git a/include/libtorrent/policy.hpp b/include/libtorrent/policy.hpp index ba650ce8c..61ca97d12 100644 --- a/include/libtorrent/policy.hpp +++ b/include/libtorrent/policy.hpp @@ -102,6 +102,8 @@ namespace libtorrent void ip_filter_updated(); + void set_seed(policy::peer* p, bool s); + #ifdef TORRENT_DEBUG bool has_connection(const peer_connection* p); diff --git a/src/peer_connection.cpp b/src/peer_connection.cpp index 38ea04102..75d35adf3 100644 --- a/src/peer_connection.cpp +++ b/src/peer_connection.cpp @@ -522,7 +522,7 @@ namespace libtorrent << " *** on_metadata(): THIS IS A SEED ***\n"; #endif // if this is a web seed. we don't have a peer_info struct - if (m_peer_info) m_peer_info->seed = true; + t->get_policy().set_seed(m_peer_info, true); m_upload_only = true; t->peer_has_all(); @@ -591,7 +591,7 @@ namespace libtorrent (*m_logger) << " *** THIS IS A SEED ***\n"; #endif // if this is a web seed. we don't have a peer_info struct - if (m_peer_info) m_peer_info->seed = true; + t->get_policy().set_seed(m_peer_info, true); m_upload_only = true; t->peer_has_all(); @@ -1361,7 +1361,7 @@ namespace libtorrent // decrement the piece count without first incrementing it if (is_seed()) { - m_peer_info->seed = true; + t->get_policy().set_seed(m_peer_info, true); m_upload_only = true; disconnect_if_redundant(); if (is_disconnecting()) return; @@ -1437,7 +1437,7 @@ namespace libtorrent { m_have_piece = bits; m_num_pieces = bits.count(); - if (m_peer_info) m_peer_info->seed = (m_num_pieces == int(bits.size())); + t->get_policy().set_seed(m_peer_info, m_num_pieces == int(bits.size())); return; } @@ -1450,7 +1450,7 @@ namespace libtorrent (*m_logger) << " *** THIS IS A SEED ***\n"; #endif // if this is a web seed. we don't have a peer_info struct - if (m_peer_info) m_peer_info->seed = true; + t->get_policy().set_seed(m_peer_info, true); m_upload_only = true; m_have_piece.set_all(); @@ -2212,7 +2212,7 @@ namespace libtorrent m_have_all = true; - if (m_peer_info) m_peer_info->seed = true; + t->get_policy().set_seed(m_peer_info, true); m_upload_only = true; m_bitfield_received = true; @@ -2273,7 +2273,7 @@ namespace libtorrent } #endif if (is_disconnecting()) return; - if (m_peer_info) m_peer_info->seed = false; + t->get_policy().set_seed(m_peer_info, false); m_bitfield_received = true; // we're never interested in a peer that doesn't have anything diff --git a/src/policy.cpp b/src/policy.cpp index c432fd563..b4b46cbe7 100644 --- a/src/policy.cpp +++ b/src/policy.cpp @@ -895,6 +895,15 @@ namespace libtorrent return false; } + void policy::set_seed(policy::peer* p, bool s) + { + if (p == 0) return; + if (p->seed == s) return; + p->seed = s; + if (s) ++m_num_seeds; + else --m_num_seeds; + } + policy::peer* policy::add_peer(tcp::endpoint const& remote, peer_id const& pid , int src, char flags) {