remove mutex from tracker_manager (#690)
remove mutex from tracker_manager
This commit is contained in:
parent
045e9316ad
commit
f56c1f8b2f
|
@ -41,7 +41,6 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <list>
|
#include <list>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <mutex>
|
|
||||||
|
|
||||||
#include <boost/shared_ptr.hpp>
|
#include <boost/shared_ptr.hpp>
|
||||||
#include <boost/enable_shared_from_this.hpp>
|
#include <boost/enable_shared_from_this.hpp>
|
||||||
|
@ -66,6 +65,7 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include "libtorrent/io_service.hpp"
|
#include "libtorrent/io_service.hpp"
|
||||||
#include "libtorrent/aux_/array_view.hpp"
|
#include "libtorrent/aux_/array_view.hpp"
|
||||||
#include "libtorrent/time.hpp"
|
#include "libtorrent/time.hpp"
|
||||||
|
#include "libtorrent/debug.hpp"
|
||||||
|
|
||||||
namespace libtorrent
|
namespace libtorrent
|
||||||
{
|
{
|
||||||
|
@ -274,9 +274,6 @@ namespace libtorrent
|
||||||
|
|
||||||
int m_completion_timeout;
|
int m_completion_timeout;
|
||||||
|
|
||||||
// TODO: 3 is this object really accessed from multiple threads?
|
|
||||||
mutable std::mutex m_mutex;
|
|
||||||
|
|
||||||
// used for timeouts
|
// used for timeouts
|
||||||
// this is set when the request has been sent
|
// this is set when the request has been sent
|
||||||
time_point m_start_time;
|
time_point m_start_time;
|
||||||
|
@ -339,6 +336,7 @@ namespace libtorrent
|
||||||
|
|
||||||
class TORRENT_EXTRA_EXPORT tracker_manager final
|
class TORRENT_EXTRA_EXPORT tracker_manager final
|
||||||
: boost::noncopyable
|
: boost::noncopyable
|
||||||
|
, single_threaded
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
@ -398,8 +396,6 @@ namespace libtorrent
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
mutable std::mutex m_mutex;
|
|
||||||
|
|
||||||
// maps transactionid to the udp_tracker_connection
|
// maps transactionid to the udp_tracker_connection
|
||||||
// These must use shared_ptr to avoid a dangling reference
|
// These must use shared_ptr to avoid a dangling reference
|
||||||
// if a connection is erased while a timeout event is in the queue
|
// if a connection is erased while a timeout event is in the queue
|
||||||
|
|
|
@ -39,6 +39,7 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
|
#include <mutex>
|
||||||
|
|
||||||
#include <boost/shared_ptr.hpp>
|
#include <boost/shared_ptr.hpp>
|
||||||
#include <boost/cstdint.hpp>
|
#include <boost/cstdint.hpp>
|
||||||
|
|
|
@ -79,7 +79,6 @@ natpmp::natpmp(io_service& ios
|
||||||
// for this array not to be reallocated, by passing
|
// for this array not to be reallocated, by passing
|
||||||
// around pointers to its elements. so reserve size for now
|
// around pointers to its elements. so reserve size for now
|
||||||
m_mappings.reserve(10);
|
m_mappings.reserve(10);
|
||||||
TORRENT_ASSERT(is_single_thread());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void natpmp::start()
|
void natpmp::start()
|
||||||
|
|
|
@ -235,8 +235,7 @@ namespace libtorrent
|
||||||
|
|
||||||
void tracker_manager::remove_request(tracker_connection const* c)
|
void tracker_manager::remove_request(tracker_connection const* c)
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> l(m_mutex);
|
TORRENT_ASSERT(is_single_thread());
|
||||||
|
|
||||||
http_conns_t::iterator i = std::find_if(m_http_conns.begin()
|
http_conns_t::iterator i = std::find_if(m_http_conns.begin()
|
||||||
, m_http_conns.end()
|
, m_http_conns.end()
|
||||||
, boost::bind(&boost::shared_ptr<http_tracker_connection>::get, _1) == c);
|
, boost::bind(&boost::shared_ptr<http_tracker_connection>::get, _1) == c);
|
||||||
|
@ -261,6 +260,7 @@ namespace libtorrent
|
||||||
boost::shared_ptr<udp_tracker_connection> c
|
boost::shared_ptr<udp_tracker_connection> c
|
||||||
, boost::uint64_t tid)
|
, boost::uint64_t tid)
|
||||||
{
|
{
|
||||||
|
TORRENT_ASSERT(is_single_thread());
|
||||||
m_udp_conns.erase(c->transaction_id());
|
m_udp_conns.erase(c->transaction_id());
|
||||||
m_udp_conns[tid] = c;
|
m_udp_conns[tid] = c;
|
||||||
}
|
}
|
||||||
|
@ -270,7 +270,7 @@ namespace libtorrent
|
||||||
, tracker_request req
|
, tracker_request req
|
||||||
, boost::weak_ptr<request_callback> c)
|
, boost::weak_ptr<request_callback> c)
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> l(m_mutex);
|
TORRENT_ASSERT(is_single_thread());
|
||||||
TORRENT_ASSERT(req.num_want >= 0);
|
TORRENT_ASSERT(req.num_want >= 0);
|
||||||
TORRENT_ASSERT(!m_abort || req.event == tracker_request::stopped);
|
TORRENT_ASSERT(!m_abort || req.event == tracker_request::stopped);
|
||||||
if (m_abort && req.event != tracker_request::stopped) return;
|
if (m_abort && req.event != tracker_request::stopped) return;
|
||||||
|
@ -316,6 +316,7 @@ namespace libtorrent
|
||||||
bool tracker_manager::incoming_packet(udp::endpoint const& ep
|
bool tracker_manager::incoming_packet(udp::endpoint const& ep
|
||||||
, aux::array_view<char const> const buf)
|
, aux::array_view<char const> const buf)
|
||||||
{
|
{
|
||||||
|
TORRENT_ASSERT(is_single_thread());
|
||||||
// ignore packets smaller than 8 bytes
|
// ignore packets smaller than 8 bytes
|
||||||
if (buf.size() < 8)
|
if (buf.size() < 8)
|
||||||
{
|
{
|
||||||
|
@ -350,17 +351,17 @@ namespace libtorrent
|
||||||
return p->on_receive(ep, buf);
|
return p->on_receive(ep, buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
void tracker_manager::incoming_error(error_code const& ec
|
void tracker_manager::incoming_error(error_code const&
|
||||||
, udp::endpoint const& ep)
|
, udp::endpoint const&)
|
||||||
{
|
{
|
||||||
TORRENT_UNUSED(ec);
|
TORRENT_ASSERT(is_single_thread());
|
||||||
TORRENT_UNUSED(ep);
|
|
||||||
// TODO: 2 implement
|
// TODO: 2 implement
|
||||||
}
|
}
|
||||||
|
|
||||||
bool tracker_manager::incoming_packet(char const* hostname
|
bool tracker_manager::incoming_packet(char const* hostname
|
||||||
, aux::array_view<char const> const buf)
|
, aux::array_view<char const> const buf)
|
||||||
{
|
{
|
||||||
|
TORRENT_ASSERT(is_single_thread());
|
||||||
// ignore packets smaller than 8 bytes
|
// ignore packets smaller than 8 bytes
|
||||||
if (buf.size() < 16) return false;
|
if (buf.size() < 16) return false;
|
||||||
|
|
||||||
|
@ -392,6 +393,7 @@ namespace libtorrent
|
||||||
void tracker_manager::send_hostname(char const* hostname, int const port
|
void tracker_manager::send_hostname(char const* hostname, int const port
|
||||||
, array_view<char const> p, error_code& ec, int const flags)
|
, array_view<char const> p, error_code& ec, int const flags)
|
||||||
{
|
{
|
||||||
|
TORRENT_ASSERT(is_single_thread());
|
||||||
m_send_fun_hostname(hostname, port, p, ec, flags);
|
m_send_fun_hostname(hostname, port, p, ec, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -399,13 +401,16 @@ namespace libtorrent
|
||||||
, array_view<char const> p
|
, array_view<char const> p
|
||||||
, error_code& ec, int const flags)
|
, error_code& ec, int const flags)
|
||||||
{
|
{
|
||||||
|
TORRENT_ASSERT(is_single_thread());
|
||||||
m_send_fun(ep, p, ec, flags);
|
m_send_fun(ep, p, ec, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
void tracker_manager::abort_all_requests(bool all)
|
void tracker_manager::abort_all_requests(bool all)
|
||||||
{
|
{
|
||||||
|
// this is called from the destructor too, which is not subject to the
|
||||||
|
// single-thread requirement.
|
||||||
|
TORRENT_ASSERT(all || is_single_thread());
|
||||||
// removes all connections except 'event=stopped'-requests
|
// removes all connections except 'event=stopped'-requests
|
||||||
std::unique_lock<std::mutex> l(m_mutex);
|
|
||||||
|
|
||||||
m_abort = true;
|
m_abort = true;
|
||||||
http_conns_t close_http_connections;
|
http_conns_t close_http_connections;
|
||||||
|
@ -441,7 +446,6 @@ namespace libtorrent
|
||||||
if (rc) rc->debug_log("aborting: %s", req.url.c_str());
|
if (rc) rc->debug_log("aborting: %s", req.url.c_str());
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
l.unlock();
|
|
||||||
|
|
||||||
for (http_conns_t::iterator i = close_http_connections.begin()
|
for (http_conns_t::iterator i = close_http_connections.begin()
|
||||||
, end(close_http_connections.end()); i != end; ++i)
|
, end(close_http_connections.end()); i != end; ++i)
|
||||||
|
@ -459,13 +463,13 @@ namespace libtorrent
|
||||||
|
|
||||||
bool tracker_manager::empty() const
|
bool tracker_manager::empty() const
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> l(m_mutex);
|
TORRENT_ASSERT(is_single_thread());
|
||||||
return m_http_conns.empty() && m_udp_conns.empty();
|
return m_http_conns.empty() && m_udp_conns.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
int tracker_manager::num_requests() const
|
int tracker_manager::num_requests() const
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> l(m_mutex);
|
TORRENT_ASSERT(is_single_thread());
|
||||||
return int(m_http_conns.size() + m_udp_conns.size());
|
return int(m_http_conns.size() + m_udp_conns.size());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,6 +34,7 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <cctype>
|
#include <cctype>
|
||||||
|
#include <mutex>
|
||||||
|
|
||||||
#include <boost/bind.hpp>
|
#include <boost/bind.hpp>
|
||||||
#include <boost/tuple/tuple.hpp>
|
#include <boost/tuple/tuple.hpp>
|
||||||
|
|
|
@ -90,7 +90,6 @@ upnp::upnp(io_service& ios
|
||||||
, m_last_if_update(min_time())
|
, m_last_if_update(min_time())
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(cb);
|
TORRENT_ASSERT(cb);
|
||||||
TORRENT_ASSERT(is_single_thread());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void upnp::start()
|
void upnp::start()
|
||||||
|
@ -104,10 +103,7 @@ void upnp::start()
|
||||||
m_mappings.reserve(10);
|
m_mappings.reserve(10);
|
||||||
}
|
}
|
||||||
|
|
||||||
upnp::~upnp()
|
upnp::~upnp() {}
|
||||||
{
|
|
||||||
TORRENT_ASSERT(is_single_thread());
|
|
||||||
}
|
|
||||||
|
|
||||||
void upnp::discover_device()
|
void upnp::discover_device()
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue