diff --git a/include/libtorrent/tracker_manager.hpp b/include/libtorrent/tracker_manager.hpp index 0506bbad9..0e4e2395c 100644 --- a/include/libtorrent/tracker_manager.hpp +++ b/include/libtorrent/tracker_manager.hpp @@ -286,7 +286,6 @@ namespace libtorrent #endif }; - // TODO: 2 this class probably doesn't need to have virtual functions. struct TORRENT_EXTRA_EXPORT tracker_connection : timeout_handler { @@ -303,7 +302,7 @@ namespace libtorrent void fail(error_code const& ec, int code = -1, char const* msg = "" , int interval = 0, int min_interval = 0); virtual void start() = 0; - virtual void close(); + virtual void close() = 0; address const& bind_interface() const { return m_req.bind_ip; } void sent_bytes(int bytes); void received_bytes(int bytes); @@ -359,7 +358,8 @@ namespace libtorrent = std::weak_ptr()); void abort_all_requests(bool all = false); - void remove_request(tracker_connection const*); + void remove_request(http_tracker_connection const* c); + void remove_request(udp_tracker_connection const* c); bool empty() const; int num_requests() const; diff --git a/src/http_tracker_connection.cpp b/src/http_tracker_connection.cpp index 8f36a78bc..46f2ec68c 100644 --- a/src/http_tracker_connection.cpp +++ b/src/http_tracker_connection.cpp @@ -253,7 +253,8 @@ namespace libtorrent m_tracker_connection->close(); m_tracker_connection.reset(); } - tracker_connection::close(); + cancel(); + m_man.remove_request(this); } // endpoints is an in-out parameter diff --git a/src/tracker_manager.cpp b/src/tracker_manager.cpp index a50f973fe..1de6ce736 100644 --- a/src/tracker_manager.cpp +++ b/src/tracker_manager.cpp @@ -196,12 +196,6 @@ namespace libtorrent m_man.received_bytes(bytes); } - void tracker_connection::close() - { - cancel(); - m_man.remove_request(this); - } - tracker_manager::tracker_manager(send_fun_t const& send_fun , send_fun_hostname_t const& send_fun_hostname , counters& stats_counters @@ -238,7 +232,7 @@ namespace libtorrent m_stats_counters.inc_stats_counter(counters::recv_tracker_bytes, bytes); } - void tracker_manager::remove_request(tracker_connection const* c) + void tracker_manager::remove_request(http_tracker_connection const* c) { TORRENT_ASSERT(is_single_thread()); http_conns_t::iterator i = std::find_if(m_http_conns.begin(), m_http_conns.end() @@ -248,14 +242,12 @@ namespace libtorrent m_http_conns.erase(i); return; } + } - udp_conns_t::iterator j = std::find_if(m_udp_conns.begin(), m_udp_conns.end() - , [c] (udp_conns_t::value_type const& uc) { return uc.second.get() == c; }); - if (j != m_udp_conns.end()) - { - m_udp_conns.erase(j); - return; - } + void tracker_manager::remove_request(udp_tracker_connection const* c) + { + TORRENT_ASSERT(is_single_thread()); + m_udp_conns.erase(c->transaction_id()); } void tracker_manager::update_transaction_id( diff --git a/src/udp_tracker_connection.cpp b/src/udp_tracker_connection.cpp index 1a51855ac..e1183cca1 100644 --- a/src/udp_tracker_connection.cpp +++ b/src/udp_tracker_connection.cpp @@ -329,8 +329,8 @@ namespace libtorrent void udp_tracker_connection::close() { - error_code ec; - tracker_connection::close(); + cancel(); + m_man.remove_request(this); } bool udp_tracker_connection::on_receive_hostname(char const* hostname