got rid of the last recursive mutexes. abstracted the threading primitives (and switched over to use asio's internal ones).
This commit is contained in:
parent
a5fb1b3455
commit
8a5b7d5d36
|
@ -154,9 +154,9 @@ else (shared)
|
||||||
add_library(torrent-rasterbar STATIC ${sources2} ${zlib_sources2})
|
add_library(torrent-rasterbar STATIC ${sources2} ${zlib_sources2})
|
||||||
endif (shared)
|
endif (shared)
|
||||||
|
|
||||||
FIND_PACKAGE( Boost 1.34 COMPONENTS filesystem thread)
|
FIND_PACKAGE( Boost 1.34 COMPONENTS filesystem)
|
||||||
if (NOT Boost_VERSION LESS 103500)
|
if (NOT Boost_VERSION LESS 103500)
|
||||||
FIND_PACKAGE( Boost 1.35 COMPONENTS filesystem thread system)
|
FIND_PACKAGE( Boost 1.35 COMPONENTS filesystem system)
|
||||||
endif (NOT Boost_VERSION LESS 103500)
|
endif (NOT Boost_VERSION LESS 103500)
|
||||||
include_directories(${Boost_INCLUDE_DIR})
|
include_directories(${Boost_INCLUDE_DIR})
|
||||||
target_link_libraries(torrent-rasterbar ${Boost_LIBRARIES})
|
target_link_libraries(torrent-rasterbar ${Boost_LIBRARIES})
|
||||||
|
|
17
Jamfile
17
Jamfile
|
@ -101,7 +101,6 @@ rule linking ( properties * )
|
||||||
if <boost>system in $(properties)
|
if <boost>system in $(properties)
|
||||||
{
|
{
|
||||||
result += <library>boost_filesystem
|
result += <library>boost_filesystem
|
||||||
<library>boost_thread
|
|
||||||
<library>boost_system
|
<library>boost_system
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
@ -127,22 +126,10 @@ rule linking ( properties * )
|
||||||
result += <library>/boost/filesystem//boost_filesystem/<link>static
|
result += <library>/boost/filesystem//boost_filesystem/<link>static
|
||||||
<library>/boost/system//boost_system/<link>static
|
<library>/boost/system//boost_system/<link>static
|
||||||
;
|
;
|
||||||
|
|
||||||
# if we're building a shared library
|
|
||||||
# we need to link dynamically against the
|
|
||||||
# pthread library
|
|
||||||
if <fpic>on in $(properties) && <target-os>linux in $(properties)
|
|
||||||
{
|
|
||||||
result += <library>/boost/thread//boost_thread/<link>shared ;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
result += <library>/boost/thread//boost_thread/<link>static ;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
result += <library>/boost/thread//boost_thread/<link>shared
|
result +=
|
||||||
<library>/boost/filesystem//boost_filesystem/<link>shared
|
<library>/boost/filesystem//boost_filesystem/<link>shared
|
||||||
<library>/boost/system//boost_system/<link>shared
|
<library>/boost/system//boost_system/<link>shared
|
||||||
;
|
;
|
||||||
|
@ -309,11 +296,9 @@ local boost-library-search-path =
|
||||||
;
|
;
|
||||||
|
|
||||||
lib boost_filesystem : : <target-os>darwin <name>boost_filesystem-mt $(boost-library-search-path) ;
|
lib boost_filesystem : : <target-os>darwin <name>boost_filesystem-mt $(boost-library-search-path) ;
|
||||||
lib boost_thread : : <target-os>darwin <name>boost_thread-mt $(boost-library-search-path) ;
|
|
||||||
lib boost_system : : <target-os>darwin <name>boost_system-mt $(boost-library-search-path) ;
|
lib boost_system : : <target-os>darwin <name>boost_system-mt $(boost-library-search-path) ;
|
||||||
|
|
||||||
lib boost_filesystem : : <name>boost_filesystem ;
|
lib boost_filesystem : : <name>boost_filesystem ;
|
||||||
lib boost_thread : : <name>boost_thread ;
|
|
||||||
lib boost_system : : <name>boost_system ;
|
lib boost_system : : <name>boost_system ;
|
||||||
|
|
||||||
# openssl on linux/bsd/macos etc.
|
# openssl on linux/bsd/macos etc.
|
||||||
|
|
|
@ -42,8 +42,6 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#pragma warning(push, 1)
|
#pragma warning(push, 1)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <boost/thread/mutex.hpp>
|
|
||||||
#include <boost/thread/condition.hpp>
|
|
||||||
#include <boost/function.hpp>
|
#include <boost/function.hpp>
|
||||||
|
|
||||||
#include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
|
#include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
|
||||||
|
@ -58,6 +56,7 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include "libtorrent/time.hpp"
|
#include "libtorrent/time.hpp"
|
||||||
#include "libtorrent/config.hpp"
|
#include "libtorrent/config.hpp"
|
||||||
#include "libtorrent/assert.hpp"
|
#include "libtorrent/assert.hpp"
|
||||||
|
#include "libtorrent/thread.hpp"
|
||||||
#include "libtorrent/socket.hpp" // for io_service
|
#include "libtorrent/socket.hpp" // for io_service
|
||||||
|
|
||||||
#ifndef TORRENT_MAX_ALERT_TYPES
|
#ifndef TORRENT_MAX_ALERT_TYPES
|
||||||
|
@ -126,7 +125,7 @@ namespace libtorrent {
|
||||||
template <class T>
|
template <class T>
|
||||||
bool should_post() const
|
bool should_post() const
|
||||||
{
|
{
|
||||||
boost::mutex::scoped_lock lock(m_mutex);
|
mutex::scoped_lock lock(m_mutex);
|
||||||
if (m_alerts.size() >= m_queue_size_limit) return false;
|
if (m_alerts.size() >= m_queue_size_limit) return false;
|
||||||
return (m_alert_mask & T::static_category) != 0;
|
return (m_alert_mask & T::static_category) != 0;
|
||||||
}
|
}
|
||||||
|
@ -135,7 +134,7 @@ namespace libtorrent {
|
||||||
|
|
||||||
void set_alert_mask(int m)
|
void set_alert_mask(int m)
|
||||||
{
|
{
|
||||||
boost::mutex::scoped_lock lock(m_mutex);
|
mutex::scoped_lock lock(m_mutex);
|
||||||
m_alert_mask = m;
|
m_alert_mask = m;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -146,8 +145,8 @@ namespace libtorrent {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::queue<alert*> m_alerts;
|
std::queue<alert*> m_alerts;
|
||||||
mutable boost::mutex m_mutex;
|
mutable mutex m_mutex;
|
||||||
boost::condition m_condition;
|
condition m_condition;
|
||||||
int m_alert_mask;
|
int m_alert_mask;
|
||||||
size_t m_queue_size_limit;
|
size_t m_queue_size_limit;
|
||||||
boost::function<void(alert const&)> m_dispatch;
|
boost::function<void(alert const&)> m_dispatch;
|
||||||
|
|
|
@ -51,8 +51,6 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <boost/filesystem/path.hpp>
|
#include <boost/filesystem/path.hpp>
|
||||||
#include <boost/thread.hpp>
|
|
||||||
#include <boost/thread/condition.hpp>
|
|
||||||
#include <boost/pool/object_pool.hpp>
|
#include <boost/pool/object_pool.hpp>
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
|
@ -79,6 +77,7 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include "libtorrent/disk_io_thread.hpp"
|
#include "libtorrent/disk_io_thread.hpp"
|
||||||
#include "libtorrent/udp_socket.hpp"
|
#include "libtorrent/udp_socket.hpp"
|
||||||
#include "libtorrent/assert.hpp"
|
#include "libtorrent/assert.hpp"
|
||||||
|
#include "libtorrent/thread.hpp"
|
||||||
#include "libtorrent/policy.hpp" // for policy::peer
|
#include "libtorrent/policy.hpp" // for policy::peer
|
||||||
#include "libtorrent/alert.hpp" // for alert_manager
|
#include "libtorrent/alert.hpp" // for alert_manager
|
||||||
#include "libtorrent/deadline_timer.hpp"
|
#include "libtorrent/deadline_timer.hpp"
|
||||||
|
@ -147,7 +146,7 @@ namespace libtorrent
|
||||||
!= m_connections.end();
|
!= m_connections.end();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
void operator()();
|
void main_thread();
|
||||||
|
|
||||||
void open_listen_port();
|
void open_listen_port();
|
||||||
|
|
||||||
|
@ -167,8 +166,7 @@ namespace libtorrent
|
||||||
|
|
||||||
// must be locked to access the data
|
// must be locked to access the data
|
||||||
// in this struct
|
// in this struct
|
||||||
typedef boost::mutex mutex_t;
|
mutable mutex m_mutex;
|
||||||
mutable mutex_t m_mutex;
|
|
||||||
|
|
||||||
boost::weak_ptr<torrent> find_torrent(const sha1_hash& info_hash);
|
boost::weak_ptr<torrent> find_torrent(const sha1_hash& info_hash);
|
||||||
peer_id const& get_peer_id() const { return m_peer_id; }
|
peer_id const& get_peer_id() const { return m_peer_id; }
|
||||||
|
@ -187,7 +185,7 @@ namespace libtorrent
|
||||||
void start_dht(entry const& startup_state);
|
void start_dht(entry const& startup_state);
|
||||||
void stop_dht();
|
void stop_dht();
|
||||||
|
|
||||||
entry dht_state(session_impl::mutex_t::scoped_lock& l) const;
|
entry dht_state(mutex::scoped_lock& l) const;
|
||||||
void maybe_update_udp_mapping(int nat, int local_port, int external_port);
|
void maybe_update_udp_mapping(int nat, int local_port, int external_port);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -367,7 +365,7 @@ namespace libtorrent
|
||||||
|
|
||||||
// private:
|
// private:
|
||||||
|
|
||||||
void on_dht_state_callback(boost::condition& c
|
void on_dht_state_callback(condition& c
|
||||||
, entry& e, bool& done) const;
|
, entry& e, bool& done) const;
|
||||||
void on_lsd_peer(tcp::endpoint peer, sha1_hash const& ih);
|
void on_lsd_peer(tcp::endpoint peer, sha1_hash const& ih);
|
||||||
void setup_socket_buffers(socket_type& s);
|
void setup_socket_buffers(socket_type& s);
|
||||||
|
@ -428,7 +426,7 @@ namespace libtorrent
|
||||||
// buffers from.
|
// buffers from.
|
||||||
boost::pool<> m_send_buffers;
|
boost::pool<> m_send_buffers;
|
||||||
#endif
|
#endif
|
||||||
boost::mutex m_send_buffer_mutex;
|
mutex m_send_buffer_mutex;
|
||||||
|
|
||||||
// the file pool that all storages in this session's
|
// the file pool that all storages in this session's
|
||||||
// torrents uses. It sets a limit on the number of
|
// torrents uses. It sets a limit on the number of
|
||||||
|
@ -750,7 +748,7 @@ namespace libtorrent
|
||||||
size_type m_total_redundant_bytes;
|
size_type m_total_redundant_bytes;
|
||||||
|
|
||||||
// the main working thread
|
// the main working thread
|
||||||
boost::scoped_ptr<boost::thread> m_thread;
|
boost::scoped_ptr<thread> m_thread;
|
||||||
};
|
};
|
||||||
|
|
||||||
#if defined TORRENT_VERBOSE_LOGGING || defined TORRENT_LOGGING || defined TORRENT_ERROR_LOGGING
|
#if defined TORRENT_VERBOSE_LOGGING || defined TORRENT_LOGGING || defined TORRENT_ERROR_LOGGING
|
||||||
|
|
|
@ -45,6 +45,7 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include "libtorrent/assert.hpp"
|
#include "libtorrent/assert.hpp"
|
||||||
#include "libtorrent/bandwidth_limit.hpp"
|
#include "libtorrent/bandwidth_limit.hpp"
|
||||||
#include "libtorrent/bandwidth_queue_entry.hpp"
|
#include "libtorrent/bandwidth_queue_entry.hpp"
|
||||||
|
#include "libtorrent/thread.hpp"
|
||||||
#include "libtorrent/bandwidth_socket.hpp"
|
#include "libtorrent/bandwidth_socket.hpp"
|
||||||
#include "libtorrent/time.hpp"
|
#include "libtorrent/time.hpp"
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,6 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include <list>
|
#include <list>
|
||||||
#include <boost/function.hpp>
|
#include <boost/function.hpp>
|
||||||
#include <boost/noncopyable.hpp>
|
#include <boost/noncopyable.hpp>
|
||||||
#include <boost/thread/mutex.hpp>
|
|
||||||
#include "libtorrent/socket.hpp"
|
#include "libtorrent/socket.hpp"
|
||||||
#include "libtorrent/error_code.hpp"
|
#include "libtorrent/error_code.hpp"
|
||||||
#include "libtorrent/deadline_timer.hpp"
|
#include "libtorrent/deadline_timer.hpp"
|
||||||
|
@ -45,6 +44,8 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "libtorrent/thread.hpp"
|
||||||
|
|
||||||
namespace libtorrent
|
namespace libtorrent
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -72,7 +73,7 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
typedef boost::mutex mutex_t;
|
typedef mutex mutex_t;
|
||||||
|
|
||||||
void try_connect(mutex_t::scoped_lock& l);
|
void try_connect(mutex_t::scoped_lock& l);
|
||||||
void on_timeout(error_code const& e);
|
void on_timeout(error_code const& e);
|
||||||
|
|
|
@ -39,9 +39,6 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
#include "libtorrent/storage.hpp"
|
#include "libtorrent/storage.hpp"
|
||||||
#include "libtorrent/allocator.hpp"
|
#include "libtorrent/allocator.hpp"
|
||||||
#include <boost/thread/thread.hpp>
|
|
||||||
#include <boost/thread/mutex.hpp>
|
|
||||||
#include <boost/thread/condition.hpp>
|
|
||||||
#include <boost/function.hpp>
|
#include <boost/function.hpp>
|
||||||
#include <boost/bind.hpp>
|
#include <boost/bind.hpp>
|
||||||
#include <boost/noncopyable.hpp>
|
#include <boost/noncopyable.hpp>
|
||||||
|
@ -52,6 +49,7 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include <boost/pool/pool.hpp>
|
#include <boost/pool/pool.hpp>
|
||||||
#endif
|
#endif
|
||||||
#include "libtorrent/session_settings.hpp"
|
#include "libtorrent/session_settings.hpp"
|
||||||
|
#include "libtorrent/thread.hpp"
|
||||||
|
|
||||||
namespace libtorrent
|
namespace libtorrent
|
||||||
{
|
{
|
||||||
|
@ -190,7 +188,7 @@ namespace libtorrent
|
||||||
|
|
||||||
#if defined TORRENT_DEBUG || defined TORRENT_DISK_STATS
|
#if defined TORRENT_DEBUG || defined TORRENT_DISK_STATS
|
||||||
bool is_disk_buffer(char* buffer
|
bool is_disk_buffer(char* buffer
|
||||||
, boost::mutex::scoped_lock& l) const;
|
, mutex::scoped_lock& l) const;
|
||||||
bool is_disk_buffer(char* buffer) const;
|
bool is_disk_buffer(char* buffer) const;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -228,9 +226,8 @@ namespace libtorrent
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
// this only protects the pool allocator
|
mutable mutex m_pool_mutex;
|
||||||
typedef boost::mutex mutex_t;
|
|
||||||
mutable mutex_t m_pool_mutex;
|
|
||||||
#ifndef TORRENT_DISABLE_POOL_ALLOCATOR
|
#ifndef TORRENT_DISABLE_POOL_ALLOCATOR
|
||||||
// memory pool for read and write operations
|
// memory pool for read and write operations
|
||||||
// and disk cache
|
// and disk cache
|
||||||
|
@ -282,7 +279,7 @@ namespace libtorrent
|
||||||
|
|
||||||
cache_status status() const;
|
cache_status status() const;
|
||||||
|
|
||||||
void operator()();
|
void thread_fun();
|
||||||
|
|
||||||
#ifdef TORRENT_DEBUG
|
#ifdef TORRENT_DEBUG
|
||||||
void check_invariant() const;
|
void check_invariant() const;
|
||||||
|
@ -312,11 +309,15 @@ namespace libtorrent
|
||||||
boost::shared_array<cached_block_entry> blocks;
|
boost::shared_array<cached_block_entry> blocks;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef boost::recursive_mutex mutex_t;
|
|
||||||
typedef std::list<cached_piece_entry> cache_t;
|
typedef std::list<cached_piece_entry> cache_t;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
void add_job(disk_io_job const& j
|
||||||
|
, mutex::scoped_lock& l
|
||||||
|
, boost::function<void(int, disk_io_job const&)> const& f
|
||||||
|
= boost::function<void(int, disk_io_job const&)>());
|
||||||
|
|
||||||
bool test_error(disk_io_job& j);
|
bool test_error(disk_io_job& j);
|
||||||
void post_callback(boost::function<void(int, disk_io_job const&)> const& handler
|
void post_callback(boost::function<void(int, disk_io_job const&)> const& handler
|
||||||
, disk_io_job const& j, int ret);
|
, disk_io_job const& j, int ret);
|
||||||
|
@ -324,39 +325,39 @@ namespace libtorrent
|
||||||
// cache operations
|
// cache operations
|
||||||
cache_t::iterator find_cached_piece(
|
cache_t::iterator find_cached_piece(
|
||||||
cache_t& cache, disk_io_job const& j
|
cache_t& cache, disk_io_job const& j
|
||||||
, mutex_t::scoped_lock& l);
|
, mutex::scoped_lock& l);
|
||||||
int copy_from_piece(cache_t::iterator p, bool& hit
|
int copy_from_piece(cache_t::iterator p, bool& hit
|
||||||
, disk_io_job const& j, mutex_t::scoped_lock& l);
|
, disk_io_job const& j, mutex::scoped_lock& l);
|
||||||
|
|
||||||
// write cache operations
|
// write cache operations
|
||||||
enum options_t { dont_flush_write_blocks = 1, ignore_cache_size = 2 };
|
enum options_t { dont_flush_write_blocks = 1, ignore_cache_size = 2 };
|
||||||
int flush_cache_blocks(mutex_t::scoped_lock& l
|
int flush_cache_blocks(mutex::scoped_lock& l
|
||||||
, int blocks, cache_t::iterator ignore
|
, int blocks, cache_t::iterator ignore
|
||||||
, int options = 0);
|
, int options = 0);
|
||||||
void flush_expired_pieces();
|
void flush_expired_pieces();
|
||||||
int flush_and_remove(cache_t::iterator i, mutex_t::scoped_lock& l);
|
int flush_and_remove(cache_t::iterator i, mutex::scoped_lock& l);
|
||||||
int flush_contiguous_blocks(disk_io_thread::cache_t::iterator e
|
int flush_contiguous_blocks(disk_io_thread::cache_t::iterator e
|
||||||
, mutex_t::scoped_lock& l, int lower_limit = 0);
|
, mutex::scoped_lock& l, int lower_limit = 0);
|
||||||
int flush_range(cache_t::iterator i, int start, int end, mutex_t::scoped_lock& l);
|
int flush_range(cache_t::iterator i, int start, int end, mutex::scoped_lock& l);
|
||||||
int cache_block(disk_io_job& j
|
int cache_block(disk_io_job& j
|
||||||
, boost::function<void(int,disk_io_job const&)>& handler
|
, boost::function<void(int,disk_io_job const&)>& handler
|
||||||
, mutex_t::scoped_lock& l);
|
, mutex::scoped_lock& l);
|
||||||
|
|
||||||
// read cache operations
|
// read cache operations
|
||||||
int clear_oldest_read_piece(int num_blocks, cache_t::iterator ignore
|
int clear_oldest_read_piece(int num_blocks, cache_t::iterator ignore
|
||||||
, mutex_t::scoped_lock& l);
|
, mutex::scoped_lock& l);
|
||||||
int read_into_piece(cached_piece_entry& p, int start_block
|
int read_into_piece(cached_piece_entry& p, int start_block
|
||||||
, int options, int num_blocks, mutex_t::scoped_lock& l);
|
, int options, int num_blocks, mutex::scoped_lock& l);
|
||||||
int cache_read_block(disk_io_job const& j, mutex_t::scoped_lock& l);
|
int cache_read_block(disk_io_job const& j, mutex::scoped_lock& l);
|
||||||
int cache_read_piece(disk_io_job const& j, mutex_t::scoped_lock& l);
|
int cache_read_piece(disk_io_job const& j, mutex::scoped_lock& l);
|
||||||
int free_piece(cached_piece_entry& p, mutex_t::scoped_lock& l);
|
int free_piece(cached_piece_entry& p, mutex::scoped_lock& l);
|
||||||
int try_read_from_cache(disk_io_job const& j);
|
int try_read_from_cache(disk_io_job const& j);
|
||||||
int read_piece_from_cache_and_hash(disk_io_job const& j, sha1_hash& h);
|
int read_piece_from_cache_and_hash(disk_io_job const& j, sha1_hash& h);
|
||||||
|
|
||||||
// this mutex only protects m_jobs, m_queue_buffer_size
|
// this mutex only protects m_jobs, m_queue_buffer_size
|
||||||
// and m_abort
|
// and m_abort
|
||||||
mutable mutex_t m_queue_mutex;
|
mutable mutex m_queue_mutex;
|
||||||
boost::condition m_signal;
|
condition m_signal;
|
||||||
bool m_abort;
|
bool m_abort;
|
||||||
bool m_waiting_to_shutdown;
|
bool m_waiting_to_shutdown;
|
||||||
std::list<disk_io_job> m_jobs;
|
std::list<disk_io_job> m_jobs;
|
||||||
|
@ -365,7 +366,7 @@ namespace libtorrent
|
||||||
ptime m_last_file_check;
|
ptime m_last_file_check;
|
||||||
|
|
||||||
// this protects the piece cache and related members
|
// this protects the piece cache and related members
|
||||||
mutable mutex_t m_piece_mutex;
|
mutable mutex m_piece_mutex;
|
||||||
// write cache
|
// write cache
|
||||||
cache_t m_pieces;
|
cache_t m_pieces;
|
||||||
|
|
||||||
|
@ -398,7 +399,7 @@ namespace libtorrent
|
||||||
boost::optional<asio::io_service::work> m_work;
|
boost::optional<asio::io_service::work> m_work;
|
||||||
|
|
||||||
// thread for performing blocking disk io operations
|
// thread for performing blocking disk io operations
|
||||||
boost::thread m_disk_io_thread;
|
thread m_disk_io_thread;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,14 +39,15 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
#include <boost/filesystem/path.hpp>
|
#include <boost/filesystem/path.hpp>
|
||||||
#include <boost/shared_ptr.hpp>
|
#include <boost/shared_ptr.hpp>
|
||||||
#include <boost/thread.hpp>
|
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
#pragma warning(pop)
|
#pragma warning(pop)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <map>
|
||||||
#include "libtorrent/file.hpp"
|
#include "libtorrent/file.hpp"
|
||||||
#include "libtorrent/time.hpp"
|
#include "libtorrent/time.hpp"
|
||||||
|
#include "libtorrent/thread.hpp"
|
||||||
|
|
||||||
namespace libtorrent
|
namespace libtorrent
|
||||||
{
|
{
|
||||||
|
@ -81,7 +82,7 @@ namespace libtorrent
|
||||||
typedef std::map<std::string, lru_file_entry> file_set;
|
typedef std::map<std::string, lru_file_entry> file_set;
|
||||||
|
|
||||||
file_set m_files;
|
file_set m_files;
|
||||||
boost::mutex m_mutex;
|
mutex m_mutex;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -44,7 +44,6 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include <boost/filesystem/operations.hpp>
|
#include <boost/filesystem/operations.hpp>
|
||||||
#include <boost/intrusive_ptr.hpp>
|
#include <boost/intrusive_ptr.hpp>
|
||||||
#include <boost/detail/atomic_count.hpp>
|
#include <boost/detail/atomic_count.hpp>
|
||||||
#include <boost/thread/mutex.hpp>
|
|
||||||
|
|
||||||
#include "libtorrent/kademlia/node.hpp"
|
#include "libtorrent/kademlia/node.hpp"
|
||||||
#include "libtorrent/kademlia/node_id.hpp"
|
#include "libtorrent/kademlia/node_id.hpp"
|
||||||
|
@ -53,6 +52,7 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include "libtorrent/session_status.hpp"
|
#include "libtorrent/session_status.hpp"
|
||||||
#include "libtorrent/udp_socket.hpp"
|
#include "libtorrent/udp_socket.hpp"
|
||||||
#include "libtorrent/socket.hpp"
|
#include "libtorrent/socket.hpp"
|
||||||
|
#include "libtorrent/thread.hpp"
|
||||||
#include "libtorrent/deadline_timer.hpp"
|
#include "libtorrent/deadline_timer.hpp"
|
||||||
|
|
||||||
namespace libtorrent
|
namespace libtorrent
|
||||||
|
@ -132,7 +132,7 @@ namespace libtorrent { namespace dht
|
||||||
|
|
||||||
// The mutex is used to abort the dht node
|
// The mutex is used to abort the dht node
|
||||||
// it's only used to set m_abort to true
|
// it's only used to set m_abort to true
|
||||||
typedef boost::mutex mutex_t;
|
typedef mutex mutex_t;
|
||||||
mutable mutex_t m_mutex;
|
mutable mutex_t m_mutex;
|
||||||
bool m_abort;
|
bool m_abort;
|
||||||
|
|
||||||
|
|
|
@ -46,12 +46,12 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include <libtorrent/io.hpp>
|
#include <libtorrent/io.hpp>
|
||||||
#include <libtorrent/session_settings.hpp>
|
#include <libtorrent/session_settings.hpp>
|
||||||
#include <libtorrent/assert.hpp>
|
#include <libtorrent/assert.hpp>
|
||||||
|
#include <libtorrent/thread.hpp>
|
||||||
|
|
||||||
#include <boost/cstdint.hpp>
|
#include <boost/cstdint.hpp>
|
||||||
#include <boost/optional.hpp>
|
#include <boost/optional.hpp>
|
||||||
#include <boost/iterator/transform_iterator.hpp>
|
#include <boost/iterator/transform_iterator.hpp>
|
||||||
#include <boost/ref.hpp>
|
#include <boost/ref.hpp>
|
||||||
#include <boost/thread/mutex.hpp>
|
|
||||||
#include <boost/optional.hpp>
|
#include <boost/optional.hpp>
|
||||||
|
|
||||||
#include "libtorrent/socket.hpp"
|
#include "libtorrent/socket.hpp"
|
||||||
|
@ -278,7 +278,7 @@ protected:
|
||||||
int m_max_peers_reply;
|
int m_max_peers_reply;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
typedef boost::mutex mutex_t;
|
typedef libtorrent::mutex mutex_t;
|
||||||
mutex_t m_mutex;
|
mutex_t m_mutex;
|
||||||
|
|
||||||
// this list must be destructed after the rpc manager
|
// this list must be destructed after the rpc manager
|
||||||
|
|
|
@ -37,6 +37,7 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include <boost/detail/atomic_count.hpp>
|
#include <boost/detail/atomic_count.hpp>
|
||||||
#include <boost/intrusive_ptr.hpp>
|
#include <boost/intrusive_ptr.hpp>
|
||||||
#include <boost/cstdint.hpp>
|
#include <boost/cstdint.hpp>
|
||||||
|
#include <libtorrent/time.hpp>
|
||||||
|
|
||||||
namespace libtorrent {
|
namespace libtorrent {
|
||||||
namespace dht {
|
namespace dht {
|
||||||
|
|
|
@ -50,6 +50,7 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include <libtorrent/session_settings.hpp>
|
#include <libtorrent/session_settings.hpp>
|
||||||
#include <libtorrent/size_type.hpp>
|
#include <libtorrent/size_type.hpp>
|
||||||
#include <libtorrent/assert.hpp>
|
#include <libtorrent/assert.hpp>
|
||||||
|
#include <libtorrent/time.hpp>
|
||||||
|
|
||||||
namespace libtorrent
|
namespace libtorrent
|
||||||
{
|
{
|
||||||
|
|
|
@ -42,8 +42,6 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include <boost/function.hpp>
|
#include <boost/function.hpp>
|
||||||
#include <boost/noncopyable.hpp>
|
#include <boost/noncopyable.hpp>
|
||||||
#include <boost/shared_ptr.hpp>
|
#include <boost/shared_ptr.hpp>
|
||||||
#include <boost/thread/mutex.hpp>
|
|
||||||
#include <boost/thread/condition.hpp>
|
|
||||||
|
|
||||||
#if defined(TORRENT_LOGGING) || defined(TORRENT_VERBOSE_LOGGING)
|
#if defined(TORRENT_LOGGING) || defined(TORRENT_VERBOSE_LOGGING)
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
|
|
@ -34,12 +34,12 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#define TORRENT_NATPMP_HPP
|
#define TORRENT_NATPMP_HPP
|
||||||
|
|
||||||
#include "libtorrent/socket.hpp"
|
#include "libtorrent/socket.hpp"
|
||||||
|
#include "libtorrent/thread.hpp"
|
||||||
#include "libtorrent/error_code.hpp"
|
#include "libtorrent/error_code.hpp"
|
||||||
#include "libtorrent/intrusive_ptr_base.hpp"
|
#include "libtorrent/intrusive_ptr_base.hpp"
|
||||||
#include "libtorrent/deadline_timer.hpp"
|
#include "libtorrent/deadline_timer.hpp"
|
||||||
|
|
||||||
#include <boost/function.hpp>
|
#include <boost/function.hpp>
|
||||||
#include <boost/thread/mutex.hpp>
|
|
||||||
|
|
||||||
namespace libtorrent
|
namespace libtorrent
|
||||||
{
|
{
|
||||||
|
@ -70,20 +70,18 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
typedef boost::mutex mutex_t;
|
void update_mapping(int i, mutex::scoped_lock& l);
|
||||||
|
void send_map_request(int i, mutex::scoped_lock& l);
|
||||||
void update_mapping(int i, mutex_t::scoped_lock& l);
|
|
||||||
void send_map_request(int i, mutex_t::scoped_lock& l);
|
|
||||||
void resend_request(int i, error_code const& e);
|
void resend_request(int i, error_code const& e);
|
||||||
void on_reply(error_code const& e
|
void on_reply(error_code const& e
|
||||||
, std::size_t bytes_transferred);
|
, std::size_t bytes_transferred);
|
||||||
void try_next_mapping(int i, mutex_t::scoped_lock& l);
|
void try_next_mapping(int i, mutex::scoped_lock& l);
|
||||||
void update_expiration_timer();
|
void update_expiration_timer();
|
||||||
void mapping_expired(error_code const& e, int i);
|
void mapping_expired(error_code const& e, int i);
|
||||||
void close_impl(mutex_t::scoped_lock& l);
|
void close_impl(mutex::scoped_lock& l);
|
||||||
|
|
||||||
void log(char const* msg, mutex_t::scoped_lock& l);
|
void log(char const* msg, mutex::scoped_lock& l);
|
||||||
void disable(error_code const& ec, mutex_t::scoped_lock& l);
|
void disable(error_code const& ec, mutex::scoped_lock& l);
|
||||||
|
|
||||||
struct mapping_t
|
struct mapping_t
|
||||||
{
|
{
|
||||||
|
@ -158,7 +156,7 @@ private:
|
||||||
|
|
||||||
bool m_abort;
|
bool m_abort;
|
||||||
|
|
||||||
mutable mutex_t m_mutex;
|
mutable mutex m_mutex;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,7 +42,6 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
#include <boost/limits.hpp>
|
#include <boost/limits.hpp>
|
||||||
#include <boost/filesystem/path.hpp>
|
#include <boost/filesystem/path.hpp>
|
||||||
#include <boost/thread.hpp>
|
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
#pragma warning(pop)
|
#pragma warning(pop)
|
||||||
|
|
|
@ -41,7 +41,6 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
#include <boost/function.hpp>
|
#include <boost/function.hpp>
|
||||||
#include <boost/limits.hpp>
|
#include <boost/limits.hpp>
|
||||||
#include <boost/thread.hpp>
|
|
||||||
#include <boost/shared_ptr.hpp>
|
#include <boost/shared_ptr.hpp>
|
||||||
#include <boost/intrusive_ptr.hpp>
|
#include <boost/intrusive_ptr.hpp>
|
||||||
#include <boost/filesystem/path.hpp>
|
#include <boost/filesystem/path.hpp>
|
||||||
|
@ -59,6 +58,7 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include "libtorrent/config.hpp"
|
#include "libtorrent/config.hpp"
|
||||||
#include "libtorrent/file.hpp"
|
#include "libtorrent/file.hpp"
|
||||||
#include "libtorrent/disk_buffer_holder.hpp"
|
#include "libtorrent/disk_buffer_holder.hpp"
|
||||||
|
#include "libtorrent/thread.hpp"
|
||||||
|
|
||||||
namespace libtorrent
|
namespace libtorrent
|
||||||
{
|
{
|
||||||
|
@ -405,7 +405,7 @@ namespace libtorrent
|
||||||
|
|
||||||
fs::path m_save_path;
|
fs::path m_save_path;
|
||||||
|
|
||||||
mutable boost::recursive_mutex m_mutex;
|
mutable mutex m_mutex;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
// the default initial state
|
// the default initial state
|
||||||
|
|
|
@ -0,0 +1,57 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
Copyright (c) 2009, Arvid Norberg
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in
|
||||||
|
the documentation and/or other materials provided with the distribution.
|
||||||
|
* Neither the name of the author nor the names of its
|
||||||
|
contributors may be used to endorse or promote products derived
|
||||||
|
from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TORRENT_THREAD_HPP_INCLUDED
|
||||||
|
#define TORRENT_THREAD_HPP_INCLUDED
|
||||||
|
|
||||||
|
#include "libtorrent/config.hpp"
|
||||||
|
#include <boost/asio/detail/thread.hpp>
|
||||||
|
#include <boost/asio/detail/mutex.hpp>
|
||||||
|
#include <boost/asio/detail/event.hpp>
|
||||||
|
|
||||||
|
namespace libtorrent
|
||||||
|
{
|
||||||
|
typedef boost::asio::detail::thread thread;
|
||||||
|
typedef boost::asio::detail::mutex mutex;
|
||||||
|
typedef boost::asio::detail::event condition;
|
||||||
|
inline void sleep(int milliseconds)
|
||||||
|
{
|
||||||
|
#if defined TORRENT_WINDOWS || defined TORRENT_CYGWIN
|
||||||
|
Sleep(milliseconds);
|
||||||
|
#else
|
||||||
|
usleep(milliseconds * 1000);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -154,7 +154,7 @@ namespace libtorrent
|
||||||
void on_force_recheck(int ret, disk_io_job const& j);
|
void on_force_recheck(int ret, disk_io_job const& j);
|
||||||
void on_piece_checked(int ret, disk_io_job const& j);
|
void on_piece_checked(int ret, disk_io_job const& j);
|
||||||
void files_checked_lock();
|
void files_checked_lock();
|
||||||
void files_checked(aux::session_impl::mutex_t::scoped_lock const&);
|
void files_checked(mutex::scoped_lock const&);
|
||||||
void start_checking();
|
void start_checking();
|
||||||
|
|
||||||
void start_announcing();
|
void start_announcing();
|
||||||
|
|
|
@ -46,8 +46,6 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include <boost/cstdint.hpp>
|
#include <boost/cstdint.hpp>
|
||||||
#include <boost/weak_ptr.hpp>
|
#include <boost/weak_ptr.hpp>
|
||||||
#include <boost/intrusive_ptr.hpp>
|
#include <boost/intrusive_ptr.hpp>
|
||||||
#include <boost/thread/mutex.hpp>
|
|
||||||
#include <boost/thread/recursive_mutex.hpp>
|
|
||||||
#include <boost/tuple/tuple.hpp>
|
#include <boost/tuple/tuple.hpp>
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
|
@ -180,7 +178,7 @@ namespace libtorrent
|
||||||
int m_completion_timeout;
|
int m_completion_timeout;
|
||||||
int m_read_timeout;
|
int m_read_timeout;
|
||||||
|
|
||||||
typedef boost::mutex mutex_t;
|
typedef mutex mutex_t;
|
||||||
mutable mutex_t m_mutex;
|
mutable mutex_t m_mutex;
|
||||||
bool m_abort;
|
bool m_abort;
|
||||||
};
|
};
|
||||||
|
@ -242,7 +240,7 @@ namespace libtorrent
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
typedef boost::recursive_mutex mutex_t;
|
typedef mutex mutex_t;
|
||||||
mutable mutex_t m_mutex;
|
mutable mutex_t m_mutex;
|
||||||
|
|
||||||
typedef std::list<boost::intrusive_ptr<tracker_connection> >
|
typedef std::list<boost::intrusive_ptr<tracker_connection> >
|
||||||
|
|
|
@ -37,11 +37,11 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include "libtorrent/error_code.hpp"
|
#include "libtorrent/error_code.hpp"
|
||||||
#include "libtorrent/session_settings.hpp"
|
#include "libtorrent/session_settings.hpp"
|
||||||
#include "libtorrent/buffer.hpp"
|
#include "libtorrent/buffer.hpp"
|
||||||
|
#include "libtorrent/thread.hpp"
|
||||||
#include "libtorrent/deadline_timer.hpp"
|
#include "libtorrent/deadline_timer.hpp"
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <boost/function.hpp>
|
#include <boost/function.hpp>
|
||||||
#include <boost/thread/mutex.hpp>
|
|
||||||
|
|
||||||
namespace libtorrent
|
namespace libtorrent
|
||||||
{
|
{
|
||||||
|
@ -97,8 +97,7 @@ namespace libtorrent
|
||||||
void wrap(udp::endpoint const& ep, char const* p, int len, error_code& ec);
|
void wrap(udp::endpoint const& ep, char const* p, int len, error_code& ec);
|
||||||
void unwrap(error_code const& e, char const* buf, int size);
|
void unwrap(error_code const& e, char const* buf, int size);
|
||||||
|
|
||||||
typedef boost::mutex mutex_t;
|
mutable mutex m_mutex;
|
||||||
mutable mutex_t m_mutex;
|
|
||||||
|
|
||||||
udp::socket m_ipv4_sock;
|
udp::socket m_ipv4_sock;
|
||||||
udp::endpoint m_v4_ep;
|
udp::endpoint m_v4_ep;
|
||||||
|
|
|
@ -39,13 +39,12 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include "libtorrent/http_connection.hpp"
|
#include "libtorrent/http_connection.hpp"
|
||||||
#include "libtorrent/connection_queue.hpp"
|
#include "libtorrent/connection_queue.hpp"
|
||||||
#include "libtorrent/intrusive_ptr_base.hpp"
|
#include "libtorrent/intrusive_ptr_base.hpp"
|
||||||
|
#include "libtorrent/thread.hpp"
|
||||||
#include "libtorrent/deadline_timer.hpp"
|
#include "libtorrent/deadline_timer.hpp"
|
||||||
|
|
||||||
#include <boost/function.hpp>
|
#include <boost/function.hpp>
|
||||||
#include <boost/noncopyable.hpp>
|
#include <boost/noncopyable.hpp>
|
||||||
#include <boost/shared_ptr.hpp>
|
#include <boost/shared_ptr.hpp>
|
||||||
#include <boost/thread/mutex.hpp>
|
|
||||||
#include <boost/thread/condition.hpp>
|
|
||||||
#include <set>
|
#include <set>
|
||||||
|
|
||||||
|
|
||||||
|
@ -119,15 +118,13 @@ public:
|
||||||
|
|
||||||
std::string router_model()
|
std::string router_model()
|
||||||
{
|
{
|
||||||
mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
return m_model;
|
return m_model;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
typedef boost::mutex mutex_t;
|
void discover_device_impl(mutex::scoped_lock& l);
|
||||||
|
|
||||||
void discover_device_impl(mutex_t::scoped_lock& l);
|
|
||||||
static address_v4 upnp_multicast_address;
|
static address_v4 upnp_multicast_address;
|
||||||
static udp::endpoint upnp_multicast_endpoint;
|
static udp::endpoint upnp_multicast_endpoint;
|
||||||
|
|
||||||
|
@ -142,8 +139,8 @@ private:
|
||||||
, std::size_t bytes_transferred);
|
, std::size_t bytes_transferred);
|
||||||
|
|
||||||
struct rootdevice;
|
struct rootdevice;
|
||||||
void next(rootdevice& d, int i, mutex_t::scoped_lock& l);
|
void next(rootdevice& d, int i, mutex::scoped_lock& l);
|
||||||
void update_map(rootdevice& d, int i, mutex_t::scoped_lock& l);
|
void update_map(rootdevice& d, int i, mutex::scoped_lock& l);
|
||||||
|
|
||||||
|
|
||||||
void on_upnp_xml(error_code const& e
|
void on_upnp_xml(error_code const& e
|
||||||
|
@ -157,14 +154,14 @@ private:
|
||||||
, int mapping, http_connection& c);
|
, int mapping, http_connection& c);
|
||||||
void on_expire(error_code const& e);
|
void on_expire(error_code const& e);
|
||||||
|
|
||||||
void disable(error_code const& ec, mutex_t::scoped_lock& l);
|
void disable(error_code const& ec, mutex::scoped_lock& l);
|
||||||
void return_error(int mapping, int code, mutex_t::scoped_lock& l);
|
void return_error(int mapping, int code, mutex::scoped_lock& l);
|
||||||
void log(char const* msg, mutex_t::scoped_lock& l);
|
void log(char const* msg, mutex::scoped_lock& l);
|
||||||
|
|
||||||
void delete_port_mapping(rootdevice& d, int i);
|
void delete_port_mapping(rootdevice& d, int i);
|
||||||
void create_port_mapping(http_connection& c, rootdevice& d, int i);
|
void create_port_mapping(http_connection& c, rootdevice& d, int i);
|
||||||
void post(upnp::rootdevice const& d, char const* soap
|
void post(upnp::rootdevice const& d, char const* soap
|
||||||
, char const* soap_action, mutex_t::scoped_lock& l);
|
, char const* soap_action, mutex::scoped_lock& l);
|
||||||
|
|
||||||
int num_mappings() const { return int(m_mappings.size()); }
|
int num_mappings() const { return int(m_mappings.size()); }
|
||||||
|
|
||||||
|
@ -312,7 +309,7 @@ private:
|
||||||
|
|
||||||
connection_queue& m_cc;
|
connection_queue& m_cc;
|
||||||
|
|
||||||
mutex_t m_mutex;
|
mutex m_mutex;
|
||||||
|
|
||||||
std::string m_model;
|
std::string m_model;
|
||||||
};
|
};
|
||||||
|
|
|
@ -33,15 +33,15 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#ifndef TORRENT_UTF8_HPP_INCLUDED
|
#ifndef TORRENT_UTF8_HPP_INCLUDED
|
||||||
#define TORRENT_UTF8_HPP_INCLUDED
|
#define TORRENT_UTF8_HPP_INCLUDED
|
||||||
|
|
||||||
#ifndef BOOST_FILESYSTEM_NARROW_ONLY
|
#if !defined BOOST_FILESYSTEM_NARROW_ONLY && !defined BOOST_NO_STD_WSTRING
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <cwchar>
|
#include <cwchar>
|
||||||
|
|
||||||
#include "libtorrent/ConvertUTF.h"
|
#include "libtorrent/ConvertUTF.h"
|
||||||
|
|
||||||
namespace libtorrent
|
namespace libtorrent
|
||||||
{
|
{
|
||||||
|
|
||||||
inline int utf8_wchar(const std::string &utf8, std::wstring &wide)
|
inline int utf8_wchar(const std::string &utf8, std::wstring &wide)
|
||||||
{
|
{
|
||||||
// allocate space for worst-case
|
// allocate space for worst-case
|
||||||
|
@ -100,7 +100,7 @@ namespace libtorrent
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif // !FILESYSTEM_NARROW_ONLY && !BOOST_NO_STD_WSTRING
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,6 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include "libtorrent/pch.hpp"
|
#include "libtorrent/pch.hpp"
|
||||||
|
|
||||||
#include "libtorrent/alert.hpp"
|
#include "libtorrent/alert.hpp"
|
||||||
#include <boost/thread/xtime.hpp>
|
|
||||||
#include <boost/function.hpp>
|
#include <boost/function.hpp>
|
||||||
#include <boost/bind.hpp>
|
#include <boost/bind.hpp>
|
||||||
|
|
||||||
|
@ -60,33 +59,34 @@ namespace libtorrent {
|
||||||
|
|
||||||
alert const* alert_manager::wait_for_alert(time_duration max_wait)
|
alert const* alert_manager::wait_for_alert(time_duration max_wait)
|
||||||
{
|
{
|
||||||
boost::mutex::scoped_lock lock(m_mutex);
|
mutex::scoped_lock lock(m_mutex);
|
||||||
|
|
||||||
if (!m_alerts.empty()) return m_alerts.front();
|
if (!m_alerts.empty()) return m_alerts.front();
|
||||||
|
|
||||||
int secs = total_seconds(max_wait);
|
// system_time end = get_system_time()
|
||||||
max_wait -= seconds(secs);
|
// + boost::posix_time::microseconds(total_microseconds(max_wait));
|
||||||
boost::xtime xt;
|
|
||||||
boost::xtime_get(&xt, boost::TIME_UTC);
|
|
||||||
xt.sec += secs;
|
|
||||||
boost::int64_t nsec = xt.nsec + total_microseconds(max_wait) * 1000;
|
|
||||||
if (nsec > 1000000000)
|
|
||||||
{
|
|
||||||
nsec -= 1000000000;
|
|
||||||
xt.sec += 1;
|
|
||||||
}
|
|
||||||
xt.nsec = boost::xtime::xtime_nsec_t(nsec);
|
|
||||||
// apparently this call can be interrupted
|
// apparently this call can be interrupted
|
||||||
// prematurely if there are other signals
|
// prematurely if there are other signals
|
||||||
while (m_condition.timed_wait(lock, xt))
|
// while (m_condition.timed_wait(lock, end))
|
||||||
if (!m_alerts.empty()) return m_alerts.front();
|
// if (!m_alerts.empty()) return m_alerts.front();
|
||||||
|
|
||||||
return 0;
|
ptime start = time_now_hires();
|
||||||
|
|
||||||
|
// TODO: change this to use an asio timer instead
|
||||||
|
while (m_alerts.empty())
|
||||||
|
{
|
||||||
|
lock.unlock();
|
||||||
|
sleep(50);
|
||||||
|
lock.lock();
|
||||||
|
if (time_now_hires() - start >= max_wait) return 0;
|
||||||
|
}
|
||||||
|
return m_alerts.front();
|
||||||
}
|
}
|
||||||
|
|
||||||
void alert_manager::set_dispatch_function(boost::function<void(alert const&)> const& fun)
|
void alert_manager::set_dispatch_function(boost::function<void(alert const&)> const& fun)
|
||||||
{
|
{
|
||||||
boost::mutex::scoped_lock lock(m_mutex);
|
mutex::scoped_lock lock(m_mutex);
|
||||||
|
|
||||||
m_dispatch = fun;
|
m_dispatch = fun;
|
||||||
|
|
||||||
|
@ -111,7 +111,7 @@ namespace libtorrent {
|
||||||
|
|
||||||
void alert_manager::post_alert(const alert& alert_)
|
void alert_manager::post_alert(const alert& alert_)
|
||||||
{
|
{
|
||||||
boost::mutex::scoped_lock lock(m_mutex);
|
mutex::scoped_lock lock(m_mutex);
|
||||||
|
|
||||||
if (m_dispatch)
|
if (m_dispatch)
|
||||||
{
|
{
|
||||||
|
@ -122,12 +122,13 @@ namespace libtorrent {
|
||||||
|
|
||||||
if (m_alerts.size() >= m_queue_size_limit) return;
|
if (m_alerts.size() >= m_queue_size_limit) return;
|
||||||
m_alerts.push(alert_.clone().release());
|
m_alerts.push(alert_.clone().release());
|
||||||
m_condition.notify_all();
|
m_condition.signal(lock);
|
||||||
|
m_condition.clear(lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::auto_ptr<alert> alert_manager::get()
|
std::auto_ptr<alert> alert_manager::get()
|
||||||
{
|
{
|
||||||
boost::mutex::scoped_lock lock(m_mutex);
|
mutex::scoped_lock lock(m_mutex);
|
||||||
|
|
||||||
TORRENT_ASSERT(!m_alerts.empty());
|
TORRENT_ASSERT(!m_alerts.empty());
|
||||||
|
|
||||||
|
@ -138,14 +139,14 @@ namespace libtorrent {
|
||||||
|
|
||||||
bool alert_manager::pending() const
|
bool alert_manager::pending() const
|
||||||
{
|
{
|
||||||
boost::mutex::scoped_lock lock(m_mutex);
|
mutex::scoped_lock lock(m_mutex);
|
||||||
|
|
||||||
return !m_alerts.empty();
|
return !m_alerts.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t alert_manager::set_alert_queue_size_limit(size_t queue_size_limit_)
|
size_t alert_manager::set_alert_queue_size_limit(size_t queue_size_limit_)
|
||||||
{
|
{
|
||||||
boost::mutex::scoped_lock lock(m_mutex);
|
mutex::scoped_lock lock(m_mutex);
|
||||||
|
|
||||||
std::swap(m_queue_size_limit, queue_size_limit_);
|
std::swap(m_queue_size_limit, queue_size_limit_);
|
||||||
return queue_size_limit_;
|
return queue_size_limit_;
|
||||||
|
|
|
@ -174,10 +174,6 @@ namespace libtorrent
|
||||||
{
|
{
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
|
|
||||||
#if BOOST_VERSION >= 103700
|
|
||||||
TORRENT_ASSERT(l.owns_lock());
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef TORRENT_CONNECTION_LOGGING
|
#ifdef TORRENT_CONNECTION_LOGGING
|
||||||
m_log << log_time() << " " << free_slots() << std::endl;
|
m_log << log_time() << " " << free_slots() << std::endl;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -84,7 +84,7 @@ namespace libtorrent
|
||||||
|
|
||||||
#if defined TORRENT_DEBUG || defined TORRENT_DISK_STATS
|
#if defined TORRENT_DEBUG || defined TORRENT_DISK_STATS
|
||||||
bool disk_buffer_pool::is_disk_buffer(char* buffer
|
bool disk_buffer_pool::is_disk_buffer(char* buffer
|
||||||
,boost::mutex::scoped_lock& l) const
|
, mutex::scoped_lock& l) const
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(m_magic == 0x1337);
|
TORRENT_ASSERT(m_magic == 0x1337);
|
||||||
#ifdef TORRENT_DISK_STATS
|
#ifdef TORRENT_DISK_STATS
|
||||||
|
@ -100,14 +100,14 @@ namespace libtorrent
|
||||||
|
|
||||||
bool disk_buffer_pool::is_disk_buffer(char* buffer) const
|
bool disk_buffer_pool::is_disk_buffer(char* buffer) const
|
||||||
{
|
{
|
||||||
mutex_t::scoped_lock l(m_pool_mutex);
|
mutex::scoped_lock l(m_pool_mutex);
|
||||||
return is_disk_buffer(buffer, l);
|
return is_disk_buffer(buffer, l);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
char* disk_buffer_pool::allocate_buffer(char const* category)
|
char* disk_buffer_pool::allocate_buffer(char const* category)
|
||||||
{
|
{
|
||||||
mutex_t::scoped_lock l(m_pool_mutex);
|
mutex::scoped_lock l(m_pool_mutex);
|
||||||
TORRENT_ASSERT(m_magic == 0x1337);
|
TORRENT_ASSERT(m_magic == 0x1337);
|
||||||
#ifdef TORRENT_DISABLE_POOL_ALLOCATOR
|
#ifdef TORRENT_DISABLE_POOL_ALLOCATOR
|
||||||
char* ret = page_aligned_allocator::malloc(m_block_size);
|
char* ret = page_aligned_allocator::malloc(m_block_size);
|
||||||
|
@ -142,7 +142,7 @@ namespace libtorrent
|
||||||
#ifdef TORRENT_DISK_STATS
|
#ifdef TORRENT_DISK_STATS
|
||||||
void disk_buffer_pool::rename_buffer(char* buf, char const* category)
|
void disk_buffer_pool::rename_buffer(char* buf, char const* category)
|
||||||
{
|
{
|
||||||
mutex_t::scoped_lock l(m_pool_mutex);
|
mutex::scoped_lock l(m_pool_mutex);
|
||||||
TORRENT_ASSERT(is_disk_buffer(buf, l));
|
TORRENT_ASSERT(is_disk_buffer(buf, l));
|
||||||
TORRENT_ASSERT(m_categories.find(m_buf_to_category[buf])
|
TORRENT_ASSERT(m_categories.find(m_buf_to_category[buf])
|
||||||
!= m_categories.end());
|
!= m_categories.end());
|
||||||
|
@ -161,7 +161,7 @@ namespace libtorrent
|
||||||
void disk_buffer_pool::free_buffer(char* buf)
|
void disk_buffer_pool::free_buffer(char* buf)
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(buf);
|
TORRENT_ASSERT(buf);
|
||||||
mutex_t::scoped_lock l(m_pool_mutex);
|
mutex::scoped_lock l(m_pool_mutex);
|
||||||
TORRENT_ASSERT(m_magic == 0x1337);
|
TORRENT_ASSERT(m_magic == 0x1337);
|
||||||
TORRENT_ASSERT(is_disk_buffer(buf, l));
|
TORRENT_ASSERT(is_disk_buffer(buf, l));
|
||||||
#if defined TORRENT_DISK_STATS || defined TORRENT_STATS
|
#if defined TORRENT_DISK_STATS || defined TORRENT_STATS
|
||||||
|
@ -195,7 +195,7 @@ namespace libtorrent
|
||||||
|
|
||||||
char* disk_buffer_pool::allocate_buffers(int num_blocks, char const* category)
|
char* disk_buffer_pool::allocate_buffers(int num_blocks, char const* category)
|
||||||
{
|
{
|
||||||
mutex_t::scoped_lock l(m_pool_mutex);
|
mutex::scoped_lock l(m_pool_mutex);
|
||||||
TORRENT_ASSERT(m_magic == 0x1337);
|
TORRENT_ASSERT(m_magic == 0x1337);
|
||||||
#ifdef TORRENT_DISABLE_POOL_ALLOCATOR
|
#ifdef TORRENT_DISABLE_POOL_ALLOCATOR
|
||||||
char* ret = page_aligned_allocator::malloc(m_block_size * num_blocks);
|
char* ret = page_aligned_allocator::malloc(m_block_size * num_blocks);
|
||||||
|
@ -230,7 +230,7 @@ namespace libtorrent
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(buf);
|
TORRENT_ASSERT(buf);
|
||||||
TORRENT_ASSERT(num_blocks >= 1);
|
TORRENT_ASSERT(num_blocks >= 1);
|
||||||
mutex_t::scoped_lock l(m_pool_mutex);
|
mutex::scoped_lock l(m_pool_mutex);
|
||||||
TORRENT_ASSERT(m_magic == 0x1337);
|
TORRENT_ASSERT(m_magic == 0x1337);
|
||||||
TORRENT_ASSERT(is_disk_buffer(buf, l));
|
TORRENT_ASSERT(is_disk_buffer(buf, l));
|
||||||
#if defined TORRENT_DISK_STATS || defined TORRENT_STATS
|
#if defined TORRENT_DISK_STATS || defined TORRENT_STATS
|
||||||
|
@ -266,7 +266,7 @@ namespace libtorrent
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(m_magic == 0x1337);
|
TORRENT_ASSERT(m_magic == 0x1337);
|
||||||
#ifndef TORRENT_DISABLE_POOL_ALLOCATOR
|
#ifndef TORRENT_DISABLE_POOL_ALLOCATOR
|
||||||
mutex_t::scoped_lock l(m_pool_mutex);
|
mutex::scoped_lock l(m_pool_mutex);
|
||||||
m_pool.release_memory();
|
m_pool.release_memory();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -285,7 +285,7 @@ namespace libtorrent
|
||||||
, m_ios(ios)
|
, m_ios(ios)
|
||||||
, m_queue_callback(queue_callback)
|
, m_queue_callback(queue_callback)
|
||||||
, m_work(io_service::work(m_ios))
|
, m_work(io_service::work(m_ios))
|
||||||
, m_disk_io_thread(boost::ref(*this))
|
, m_disk_io_thread(boost::bind(&disk_io_thread::thread_fun, this))
|
||||||
{
|
{
|
||||||
#ifdef TORRENT_DISK_STATS
|
#ifdef TORRENT_DISK_STATS
|
||||||
m_log.open("disk_io_thread.log", std::ios::trunc);
|
m_log.open("disk_io_thread.log", std::ios::trunc);
|
||||||
|
@ -299,12 +299,12 @@ namespace libtorrent
|
||||||
|
|
||||||
void disk_io_thread::join()
|
void disk_io_thread::join()
|
||||||
{
|
{
|
||||||
mutex_t::scoped_lock l(m_queue_mutex);
|
mutex::scoped_lock l(m_queue_mutex);
|
||||||
disk_io_job j;
|
disk_io_job j;
|
||||||
m_waiting_to_shutdown = true;
|
m_waiting_to_shutdown = true;
|
||||||
j.action = disk_io_job::abort_thread;
|
j.action = disk_io_job::abort_thread;
|
||||||
m_jobs.insert(m_jobs.begin(), j);
|
m_jobs.insert(m_jobs.begin(), j);
|
||||||
m_signal.notify_all();
|
m_signal.signal(l);
|
||||||
l.unlock();
|
l.unlock();
|
||||||
|
|
||||||
m_disk_io_thread.join();
|
m_disk_io_thread.join();
|
||||||
|
@ -315,7 +315,7 @@ namespace libtorrent
|
||||||
|
|
||||||
void disk_io_thread::get_cache_info(sha1_hash const& ih, std::vector<cached_piece_info>& ret) const
|
void disk_io_thread::get_cache_info(sha1_hash const& ih, std::vector<cached_piece_info>& ret) const
|
||||||
{
|
{
|
||||||
mutex_t::scoped_lock l(m_piece_mutex);
|
mutex::scoped_lock l(m_piece_mutex);
|
||||||
ret.clear();
|
ret.clear();
|
||||||
ret.reserve(m_pieces.size());
|
ret.reserve(m_pieces.size());
|
||||||
for (cache_t::const_iterator i = m_pieces.begin()
|
for (cache_t::const_iterator i = m_pieces.begin()
|
||||||
|
@ -352,7 +352,7 @@ namespace libtorrent
|
||||||
|
|
||||||
cache_status disk_io_thread::status() const
|
cache_status disk_io_thread::status() const
|
||||||
{
|
{
|
||||||
mutex_t::scoped_lock l(m_piece_mutex);
|
mutex::scoped_lock l(m_piece_mutex);
|
||||||
m_cache_stats.total_used_buffers = in_use();
|
m_cache_stats.total_used_buffers = in_use();
|
||||||
m_cache_stats.queued_bytes = m_queue_buffer_size;
|
m_cache_stats.queued_bytes = m_queue_buffer_size;
|
||||||
return m_cache_stats;
|
return m_cache_stats;
|
||||||
|
@ -361,7 +361,7 @@ namespace libtorrent
|
||||||
// aborts read operations
|
// aborts read operations
|
||||||
void disk_io_thread::stop(boost::intrusive_ptr<piece_manager> s)
|
void disk_io_thread::stop(boost::intrusive_ptr<piece_manager> s)
|
||||||
{
|
{
|
||||||
mutex_t::scoped_lock l(m_queue_mutex);
|
mutex::scoped_lock l(m_queue_mutex);
|
||||||
// read jobs are aborted, write and move jobs are syncronized
|
// read jobs are aborted, write and move jobs are syncronized
|
||||||
for (std::list<disk_io_job>::iterator i = m_jobs.begin();
|
for (std::list<disk_io_job>::iterator i = m_jobs.begin();
|
||||||
i != m_jobs.end();)
|
i != m_jobs.end();)
|
||||||
|
@ -388,7 +388,7 @@ namespace libtorrent
|
||||||
disk_io_job j;
|
disk_io_job j;
|
||||||
j.action = disk_io_job::abort_torrent;
|
j.action = disk_io_job::abort_torrent;
|
||||||
j.storage = s;
|
j.storage = s;
|
||||||
add_job(j);
|
add_job(j, l);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool range_overlap(int start1, int length1, int start2, int length2)
|
bool range_overlap(int start1, int length1, int start2, int length2)
|
||||||
|
@ -420,7 +420,7 @@ namespace libtorrent
|
||||||
|
|
||||||
disk_io_thread::cache_t::iterator disk_io_thread::find_cached_piece(
|
disk_io_thread::cache_t::iterator disk_io_thread::find_cached_piece(
|
||||||
disk_io_thread::cache_t& cache
|
disk_io_thread::cache_t& cache
|
||||||
, disk_io_job const& j, mutex_t::scoped_lock& l)
|
, disk_io_job const& j, mutex::scoped_lock& l)
|
||||||
{
|
{
|
||||||
for (cache_t::iterator i = cache.begin()
|
for (cache_t::iterator i = cache.begin()
|
||||||
, end(cache.end()); i != end; ++i)
|
, end(cache.end()); i != end; ++i)
|
||||||
|
@ -435,7 +435,7 @@ namespace libtorrent
|
||||||
{
|
{
|
||||||
ptime now = time_now();
|
ptime now = time_now();
|
||||||
|
|
||||||
mutex_t::scoped_lock l(m_piece_mutex);
|
mutex::scoped_lock l(m_piece_mutex);
|
||||||
|
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
// flush write cache
|
// flush write cache
|
||||||
|
@ -467,7 +467,7 @@ namespace libtorrent
|
||||||
}
|
}
|
||||||
|
|
||||||
// returns the number of blocks that were freed
|
// returns the number of blocks that were freed
|
||||||
int disk_io_thread::free_piece(cached_piece_entry& p, mutex_t::scoped_lock& l)
|
int disk_io_thread::free_piece(cached_piece_entry& p, mutex::scoped_lock& l)
|
||||||
{
|
{
|
||||||
int piece_size = p.storage->info()->piece_size(p.piece);
|
int piece_size = p.storage->info()->piece_size(p.piece);
|
||||||
int blocks_in_piece = (piece_size + m_block_size - 1) / m_block_size;
|
int blocks_in_piece = (piece_size + m_block_size - 1) / m_block_size;
|
||||||
|
@ -490,7 +490,7 @@ namespace libtorrent
|
||||||
int disk_io_thread::clear_oldest_read_piece(
|
int disk_io_thread::clear_oldest_read_piece(
|
||||||
int num_blocks
|
int num_blocks
|
||||||
, cache_t::iterator ignore
|
, cache_t::iterator ignore
|
||||||
, mutex_t::scoped_lock& l)
|
, mutex::scoped_lock& l)
|
||||||
{
|
{
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
|
|
||||||
|
@ -564,7 +564,7 @@ namespace libtorrent
|
||||||
}
|
}
|
||||||
|
|
||||||
int disk_io_thread::flush_contiguous_blocks(disk_io_thread::cache_t::iterator e
|
int disk_io_thread::flush_contiguous_blocks(disk_io_thread::cache_t::iterator e
|
||||||
, mutex_t::scoped_lock& l, int lower_limit)
|
, mutex::scoped_lock& l, int lower_limit)
|
||||||
{
|
{
|
||||||
// first find the largest range of contiguous blocks
|
// first find the largest range of contiguous blocks
|
||||||
int len = 0;
|
int len = 0;
|
||||||
|
@ -600,7 +600,7 @@ namespace libtorrent
|
||||||
}
|
}
|
||||||
|
|
||||||
// flushes 'blocks' blocks from the cache
|
// flushes 'blocks' blocks from the cache
|
||||||
int disk_io_thread::flush_cache_blocks(mutex_t::scoped_lock& l
|
int disk_io_thread::flush_cache_blocks(mutex::scoped_lock& l
|
||||||
, int blocks, cache_t::iterator ignore, int options)
|
, int blocks, cache_t::iterator ignore, int options)
|
||||||
{
|
{
|
||||||
// first look if there are any read cache entries that can
|
// first look if there are any read cache entries that can
|
||||||
|
@ -647,7 +647,7 @@ namespace libtorrent
|
||||||
}
|
}
|
||||||
|
|
||||||
int disk_io_thread::flush_and_remove(disk_io_thread::cache_t::iterator e
|
int disk_io_thread::flush_and_remove(disk_io_thread::cache_t::iterator e
|
||||||
, mutex_t::scoped_lock& l)
|
, mutex::scoped_lock& l)
|
||||||
{
|
{
|
||||||
int ret = flush_range(e, 0, INT_MAX, l);
|
int ret = flush_range(e, 0, INT_MAX, l);
|
||||||
m_pieces.erase(e);
|
m_pieces.erase(e);
|
||||||
|
@ -655,7 +655,7 @@ namespace libtorrent
|
||||||
}
|
}
|
||||||
|
|
||||||
int disk_io_thread::flush_range(disk_io_thread::cache_t::iterator e
|
int disk_io_thread::flush_range(disk_io_thread::cache_t::iterator e
|
||||||
, int start, int end, mutex_t::scoped_lock& l)
|
, int start, int end, mutex::scoped_lock& l)
|
||||||
{
|
{
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
|
|
||||||
|
@ -761,7 +761,7 @@ namespace libtorrent
|
||||||
// returns -1 on failure
|
// returns -1 on failure
|
||||||
int disk_io_thread::cache_block(disk_io_job& j
|
int disk_io_thread::cache_block(disk_io_job& j
|
||||||
, boost::function<void(int,disk_io_job const&)>& handler
|
, boost::function<void(int,disk_io_job const&)>& handler
|
||||||
, mutex_t::scoped_lock& l)
|
, mutex::scoped_lock& l)
|
||||||
{
|
{
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
TORRENT_ASSERT(find_cached_piece(m_pieces, j, l) == m_pieces.end());
|
TORRENT_ASSERT(find_cached_piece(m_pieces, j, l) == m_pieces.end());
|
||||||
|
@ -796,7 +796,7 @@ namespace libtorrent
|
||||||
// fills a piece with data from disk, returns the total number of bytes
|
// fills a piece with data from disk, returns the total number of bytes
|
||||||
// read or -1 if there was an error
|
// read or -1 if there was an error
|
||||||
int disk_io_thread::read_into_piece(cached_piece_entry& p, int start_block
|
int disk_io_thread::read_into_piece(cached_piece_entry& p, int start_block
|
||||||
, int options, int num_blocks, mutex_t::scoped_lock& l)
|
, int options, int num_blocks, mutex::scoped_lock& l)
|
||||||
{
|
{
|
||||||
int piece_size = p.storage->info()->piece_size(p.piece);
|
int piece_size = p.storage->info()->piece_size(p.piece);
|
||||||
int blocks_in_piece = (piece_size + m_block_size - 1) / m_block_size;
|
int blocks_in_piece = (piece_size + m_block_size - 1) / m_block_size;
|
||||||
|
@ -904,7 +904,7 @@ namespace libtorrent
|
||||||
// piece regardless of the offset in j
|
// piece regardless of the offset in j
|
||||||
// this is used for seed-mode, where we need to read the entire piece to calculate
|
// this is used for seed-mode, where we need to read the entire piece to calculate
|
||||||
// the hash
|
// the hash
|
||||||
int disk_io_thread::cache_read_piece(disk_io_job const& j, mutex_t::scoped_lock& l)
|
int disk_io_thread::cache_read_piece(disk_io_job const& j, mutex::scoped_lock& l)
|
||||||
{
|
{
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
|
|
||||||
|
@ -933,7 +933,7 @@ namespace libtorrent
|
||||||
|
|
||||||
// returns -1 on read error, -2 if there isn't any space in the cache
|
// returns -1 on read error, -2 if there isn't any space in the cache
|
||||||
// or the number of bytes read
|
// or the number of bytes read
|
||||||
int disk_io_thread::cache_read_block(disk_io_job const& j, mutex_t::scoped_lock& l)
|
int disk_io_thread::cache_read_block(disk_io_job const& j, mutex::scoped_lock& l)
|
||||||
{
|
{
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
|
|
||||||
|
@ -1041,7 +1041,7 @@ namespace libtorrent
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(j.buffer);
|
TORRENT_ASSERT(j.buffer);
|
||||||
|
|
||||||
mutex_t::scoped_lock l(m_piece_mutex);
|
mutex::scoped_lock l(m_piece_mutex);
|
||||||
|
|
||||||
cache_t::iterator p
|
cache_t::iterator p
|
||||||
= find_cached_piece(m_read_pieces, j, l);
|
= find_cached_piece(m_read_pieces, j, l);
|
||||||
|
@ -1103,7 +1103,7 @@ namespace libtorrent
|
||||||
}
|
}
|
||||||
|
|
||||||
int disk_io_thread::copy_from_piece(cache_t::iterator p, bool& hit
|
int disk_io_thread::copy_from_piece(cache_t::iterator p, bool& hit
|
||||||
, disk_io_job const& j, mutex_t::scoped_lock& l)
|
, disk_io_job const& j, mutex::scoped_lock& l)
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(j.buffer);
|
TORRENT_ASSERT(j.buffer);
|
||||||
|
|
||||||
|
@ -1165,7 +1165,7 @@ namespace libtorrent
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(j.buffer);
|
TORRENT_ASSERT(j.buffer);
|
||||||
|
|
||||||
mutex_t::scoped_lock l(m_piece_mutex);
|
mutex::scoped_lock l(m_piece_mutex);
|
||||||
if (!m_settings.use_read_cache) return -2;
|
if (!m_settings.use_read_cache) return -2;
|
||||||
|
|
||||||
cache_t::iterator p
|
cache_t::iterator p
|
||||||
|
@ -1202,10 +1202,22 @@ namespace libtorrent
|
||||||
|
|
||||||
size_type disk_io_thread::queue_buffer_size() const
|
size_type disk_io_thread::queue_buffer_size() const
|
||||||
{
|
{
|
||||||
mutex_t::scoped_lock l(m_queue_mutex);
|
mutex::scoped_lock l(m_queue_mutex);
|
||||||
return m_queue_buffer_size;
|
return m_queue_buffer_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void disk_io_thread::add_job(disk_io_job const& j
|
||||||
|
, mutex::scoped_lock& l
|
||||||
|
, boost::function<void(int, disk_io_job const&)> const& f)
|
||||||
|
{
|
||||||
|
m_jobs.push_back(j);
|
||||||
|
m_jobs.back().callback.swap(const_cast<boost::function<void(int, disk_io_job const&)>&>(f));
|
||||||
|
|
||||||
|
if (j.action == disk_io_job::write)
|
||||||
|
m_queue_buffer_size += j.buffer_size;
|
||||||
|
m_signal.signal(l);
|
||||||
|
}
|
||||||
|
|
||||||
void disk_io_thread::add_job(disk_io_job const& j
|
void disk_io_thread::add_job(disk_io_job const& j
|
||||||
, boost::function<void(int, disk_io_job const&)> const& f)
|
, boost::function<void(int, disk_io_job const&)> const& f)
|
||||||
{
|
{
|
||||||
|
@ -1215,56 +1227,8 @@ namespace libtorrent
|
||||||
|| j.action == disk_io_job::abort_thread
|
|| j.action == disk_io_job::abort_thread
|
||||||
|| j.action == disk_io_job::update_settings);
|
|| j.action == disk_io_job::update_settings);
|
||||||
TORRENT_ASSERT(j.buffer_size <= m_block_size);
|
TORRENT_ASSERT(j.buffer_size <= m_block_size);
|
||||||
mutex_t::scoped_lock l(m_queue_mutex);
|
mutex::scoped_lock l(m_queue_mutex);
|
||||||
|
add_job(j, l, f);
|
||||||
std::list<disk_io_job>::reverse_iterator i = m_jobs.rbegin();
|
|
||||||
if (j.action == disk_io_job::read)
|
|
||||||
{
|
|
||||||
// when we're reading, we may not skip
|
|
||||||
// ahead of any write operation that overlaps
|
|
||||||
// the region we're reading
|
|
||||||
for (; i != m_jobs.rend(); i++)
|
|
||||||
{
|
|
||||||
// if *i should come before j, stop
|
|
||||||
// and insert j before i
|
|
||||||
if (*i < j) break;
|
|
||||||
// if we come across a write operation that
|
|
||||||
// overlaps the region we're reading, we need
|
|
||||||
// to stop
|
|
||||||
if (i->action == disk_io_job::write
|
|
||||||
&& i->storage == j.storage
|
|
||||||
&& i->piece == j.piece
|
|
||||||
&& range_overlap(i->offset, i->buffer_size
|
|
||||||
, j.offset, j.buffer_size))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (j.action == disk_io_job::write)
|
|
||||||
{
|
|
||||||
for (; i != m_jobs.rend(); ++i)
|
|
||||||
{
|
|
||||||
if (*i < j)
|
|
||||||
{
|
|
||||||
if (i != m_jobs.rbegin()
|
|
||||||
&& i.base()->storage.get() != j.storage.get())
|
|
||||||
i = m_jobs.rbegin();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// if we are placed in front of all other jobs, put it on the back of
|
|
||||||
// the queue, to sweep the disk in the same direction, and to avoid
|
|
||||||
// starvation. The exception is if the priority is higher than the
|
|
||||||
// job at the front of the queue
|
|
||||||
if (i == m_jobs.rend() && (m_jobs.empty() || j.priority <= m_jobs.back().priority))
|
|
||||||
i = m_jobs.rbegin();
|
|
||||||
|
|
||||||
std::list<disk_io_job>::iterator k = m_jobs.insert(i.base(), j);
|
|
||||||
k->callback.swap(const_cast<boost::function<void(int, disk_io_job const&)>&>(f));
|
|
||||||
if (j.action == disk_io_job::write)
|
|
||||||
m_queue_buffer_size += j.buffer_size;
|
|
||||||
m_signal.notify_all();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool disk_io_thread::test_error(disk_io_job& j)
|
bool disk_io_thread::test_error(disk_io_job& j)
|
||||||
|
@ -1278,8 +1242,7 @@ namespace libtorrent
|
||||||
j.error = ec;
|
j.error = ec;
|
||||||
j.error_file = j.storage->error_file();
|
j.error_file = j.storage->error_file();
|
||||||
#ifdef TORRENT_DEBUG
|
#ifdef TORRENT_DEBUG
|
||||||
std::cout << "ERROR: '" << ec.message() << " in "
|
printf("ERROR: '%s' in %s\n", ec.message().c_str(), j.error_file.c_str());
|
||||||
<< j.error_file << std::endl;
|
|
||||||
#endif
|
#endif
|
||||||
j.storage->clear_error();
|
j.storage->clear_error();
|
||||||
return true;
|
return true;
|
||||||
|
@ -1340,7 +1303,7 @@ namespace libtorrent
|
||||||
return action_flags[j.action] & buffer_operation;
|
return action_flags[j.action] & buffer_operation;
|
||||||
}
|
}
|
||||||
|
|
||||||
void disk_io_thread::operator()()
|
void disk_io_thread::thread_fun()
|
||||||
{
|
{
|
||||||
size_type elevator_position = 0;
|
size_type elevator_position = 0;
|
||||||
int elevator_direction = 1;
|
int elevator_direction = 1;
|
||||||
|
@ -1350,7 +1313,7 @@ namespace libtorrent
|
||||||
#ifdef TORRENT_DISK_STATS
|
#ifdef TORRENT_DISK_STATS
|
||||||
m_log << log_time() << " idle" << std::endl;
|
m_log << log_time() << " idle" << std::endl;
|
||||||
#endif
|
#endif
|
||||||
mutex_t::scoped_lock jl(m_queue_mutex);
|
mutex::scoped_lock jl(m_queue_mutex);
|
||||||
|
|
||||||
while (m_jobs.empty() && !m_abort)
|
while (m_jobs.empty() && !m_abort)
|
||||||
{
|
{
|
||||||
|
@ -1359,13 +1322,14 @@ namespace libtorrent
|
||||||
// if (!m_signal.timed_wait(jl, boost::posix_time::seconds(1)))
|
// if (!m_signal.timed_wait(jl, boost::posix_time::seconds(1)))
|
||||||
// flush_expired_pieces();
|
// flush_expired_pieces();
|
||||||
m_signal.wait(jl);
|
m_signal.wait(jl);
|
||||||
|
m_signal.clear(jl);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_abort && m_jobs.empty())
|
if (m_abort && m_jobs.empty())
|
||||||
{
|
{
|
||||||
jl.unlock();
|
jl.unlock();
|
||||||
|
|
||||||
mutex_t::scoped_lock l(m_piece_mutex);
|
mutex::scoped_lock l(m_piece_mutex);
|
||||||
// flush all disk caches
|
// flush all disk caches
|
||||||
for (cache_t::iterator i = m_pieces.begin()
|
for (cache_t::iterator i = m_pieces.begin()
|
||||||
, end(m_pieces.end()); i != end; ++i)
|
, end(m_pieces.end()); i != end; ++i)
|
||||||
|
@ -1521,7 +1485,7 @@ namespace libtorrent
|
||||||
#ifdef TORRENT_DISK_STATS
|
#ifdef TORRENT_DISK_STATS
|
||||||
m_log << log_time() << " abort_torrent " << std::endl;
|
m_log << log_time() << " abort_torrent " << std::endl;
|
||||||
#endif
|
#endif
|
||||||
mutex_t::scoped_lock jl(m_queue_mutex);
|
mutex::scoped_lock jl(m_queue_mutex);
|
||||||
for (std::list<disk_io_job>::iterator i = m_jobs.begin();
|
for (std::list<disk_io_job>::iterator i = m_jobs.begin();
|
||||||
i != m_jobs.end();)
|
i != m_jobs.end();)
|
||||||
{
|
{
|
||||||
|
@ -1545,7 +1509,7 @@ namespace libtorrent
|
||||||
#ifdef TORRENT_DISK_STATS
|
#ifdef TORRENT_DISK_STATS
|
||||||
m_log << log_time() << " abort_thread " << std::endl;
|
m_log << log_time() << " abort_thread " << std::endl;
|
||||||
#endif
|
#endif
|
||||||
mutex_t::scoped_lock jl(m_queue_mutex);
|
mutex::scoped_lock jl(m_queue_mutex);
|
||||||
|
|
||||||
for (std::list<disk_io_job>::iterator i = m_jobs.begin();
|
for (std::list<disk_io_job>::iterator i = m_jobs.begin();
|
||||||
i != m_jobs.end();)
|
i != m_jobs.end();)
|
||||||
|
@ -1702,7 +1666,7 @@ namespace libtorrent
|
||||||
#ifdef TORRENT_DISK_STATS
|
#ifdef TORRENT_DISK_STATS
|
||||||
m_log << log_time() << " write " << j.buffer_size << std::endl;
|
m_log << log_time() << " write " << j.buffer_size << std::endl;
|
||||||
#endif
|
#endif
|
||||||
mutex_t::scoped_lock l(m_piece_mutex);
|
mutex::scoped_lock l(m_piece_mutex);
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
|
|
||||||
if (in_use() >= m_settings.cache_size)
|
if (in_use() >= m_settings.cache_size)
|
||||||
|
@ -1762,7 +1726,7 @@ namespace libtorrent
|
||||||
#ifdef TORRENT_DISK_STATS
|
#ifdef TORRENT_DISK_STATS
|
||||||
m_log << log_time() << " hash" << std::endl;
|
m_log << log_time() << " hash" << std::endl;
|
||||||
#endif
|
#endif
|
||||||
mutex_t::scoped_lock l(m_piece_mutex);
|
mutex::scoped_lock l(m_piece_mutex);
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
|
|
||||||
cache_t::iterator i
|
cache_t::iterator i
|
||||||
|
@ -1817,7 +1781,7 @@ namespace libtorrent
|
||||||
#endif
|
#endif
|
||||||
TORRENT_ASSERT(j.buffer == 0);
|
TORRENT_ASSERT(j.buffer == 0);
|
||||||
|
|
||||||
mutex_t::scoped_lock l(m_piece_mutex);
|
mutex::scoped_lock l(m_piece_mutex);
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
|
|
||||||
for (cache_t::iterator i = m_pieces.begin(); i != m_pieces.end();)
|
for (cache_t::iterator i = m_pieces.begin(); i != m_pieces.end();)
|
||||||
|
@ -1846,7 +1810,7 @@ namespace libtorrent
|
||||||
#endif
|
#endif
|
||||||
TORRENT_ASSERT(j.buffer == 0);
|
TORRENT_ASSERT(j.buffer == 0);
|
||||||
|
|
||||||
mutex_t::scoped_lock l(m_piece_mutex);
|
mutex::scoped_lock l(m_piece_mutex);
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
|
|
||||||
for (cache_t::iterator i = m_read_pieces.begin();
|
for (cache_t::iterator i = m_read_pieces.begin();
|
||||||
|
@ -1874,7 +1838,7 @@ namespace libtorrent
|
||||||
#endif
|
#endif
|
||||||
TORRENT_ASSERT(j.buffer == 0);
|
TORRENT_ASSERT(j.buffer == 0);
|
||||||
|
|
||||||
mutex_t::scoped_lock l(m_piece_mutex);
|
mutex::scoped_lock l(m_piece_mutex);
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
|
|
||||||
cache_t::iterator i = std::remove_if(
|
cache_t::iterator i = std::remove_if(
|
||||||
|
@ -1929,8 +1893,7 @@ namespace libtorrent
|
||||||
if (sleep_time < 0) sleep_time = 0;
|
if (sleep_time < 0) sleep_time = 0;
|
||||||
TORRENT_ASSERT(sleep_time < 5 * 1000);
|
TORRENT_ASSERT(sleep_time < 5 * 1000);
|
||||||
|
|
||||||
boost::thread::sleep(boost::get_system_time()
|
sleep(sleep_time);
|
||||||
+ boost::posix_time::milliseconds(sleep_time));
|
|
||||||
}
|
}
|
||||||
m_last_file_check = time_now_hires();
|
m_last_file_check = time_now_hires();
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -45,7 +45,7 @@ namespace libtorrent
|
||||||
TORRENT_ASSERT(p.is_complete());
|
TORRENT_ASSERT(p.is_complete());
|
||||||
TORRENT_ASSERT((m & file::rw_mask) == file::read_only
|
TORRENT_ASSERT((m & file::rw_mask) == file::read_only
|
||||||
|| (m & file::rw_mask) == file::read_write);
|
|| (m & file::rw_mask) == file::read_write);
|
||||||
boost::mutex::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
file_set::iterator i = m_files.find(p.string());
|
file_set::iterator i = m_files.find(p.string());
|
||||||
if (i != m_files.end())
|
if (i != m_files.end())
|
||||||
{
|
{
|
||||||
|
@ -119,7 +119,7 @@ namespace libtorrent
|
||||||
|
|
||||||
void file_pool::release(fs::path const& p)
|
void file_pool::release(fs::path const& p)
|
||||||
{
|
{
|
||||||
boost::mutex::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
|
|
||||||
file_set::iterator i = m_files.find(p.string());
|
file_set::iterator i = m_files.find(p.string());
|
||||||
if (i != m_files.end()) m_files.erase(i);
|
if (i != m_files.end()) m_files.erase(i);
|
||||||
|
@ -127,7 +127,7 @@ namespace libtorrent
|
||||||
|
|
||||||
void file_pool::release(void* st)
|
void file_pool::release(void* st)
|
||||||
{
|
{
|
||||||
boost::mutex::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
TORRENT_ASSERT(st != 0);
|
TORRENT_ASSERT(st != 0);
|
||||||
|
|
||||||
for (file_set::iterator i = m_files.begin();
|
for (file_set::iterator i = m_files.begin();
|
||||||
|
@ -144,7 +144,7 @@ namespace libtorrent
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(size > 0);
|
TORRENT_ASSERT(size > 0);
|
||||||
if (size == m_size) return;
|
if (size == m_size) return;
|
||||||
boost::mutex::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
m_size = size;
|
m_size = size;
|
||||||
if (int(m_files.size()) <= m_size) return;
|
if (int(m_files.size()) <= m_size) return;
|
||||||
|
|
||||||
|
|
|
@ -49,7 +49,6 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include <boost/asio/ip/host_name.hpp>
|
#include <boost/asio/ip/host_name.hpp>
|
||||||
#include <boost/asio/ip/multicast.hpp>
|
#include <boost/asio/ip/multicast.hpp>
|
||||||
#endif
|
#endif
|
||||||
#include <boost/thread/mutex.hpp>
|
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <boost/config.hpp>
|
#include <boost/config.hpp>
|
||||||
|
|
||||||
|
|
|
@ -68,7 +68,7 @@ natpmp::natpmp(io_service& ios, address const& listen_interface
|
||||||
|
|
||||||
void natpmp::rebind(address const& listen_interface)
|
void natpmp::rebind(address const& listen_interface)
|
||||||
{
|
{
|
||||||
mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
|
|
||||||
error_code ec;
|
error_code ec;
|
||||||
address gateway = get_default_gateway(m_socket.get_io_service(), ec);
|
address gateway = get_default_gateway(m_socket.get_io_service(), ec);
|
||||||
|
@ -121,7 +121,7 @@ void natpmp::rebind(address const& listen_interface)
|
||||||
|
|
||||||
bool natpmp::get_mapping(int index, int& local_port, int& external_port, int& protocol) const
|
bool natpmp::get_mapping(int index, int& local_port, int& external_port, int& protocol) const
|
||||||
{
|
{
|
||||||
mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
|
|
||||||
TORRENT_ASSERT(index < int(m_mappings.size()) && index >= 0);
|
TORRENT_ASSERT(index < int(m_mappings.size()) && index >= 0);
|
||||||
if (index >= int(m_mappings.size()) || index < 0) return false;
|
if (index >= int(m_mappings.size()) || index < 0) return false;
|
||||||
|
@ -133,14 +133,14 @@ bool natpmp::get_mapping(int index, int& local_port, int& external_port, int& pr
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void natpmp::log(char const* msg, mutex_t::scoped_lock& l)
|
void natpmp::log(char const* msg, mutex::scoped_lock& l)
|
||||||
{
|
{
|
||||||
l.unlock();
|
l.unlock();
|
||||||
m_log_callback(msg);
|
m_log_callback(msg);
|
||||||
l.lock();
|
l.lock();
|
||||||
}
|
}
|
||||||
|
|
||||||
void natpmp::disable(error_code const& ec, mutex_t::scoped_lock& l)
|
void natpmp::disable(error_code const& ec, mutex::scoped_lock& l)
|
||||||
{
|
{
|
||||||
m_disabled = true;
|
m_disabled = true;
|
||||||
|
|
||||||
|
@ -159,7 +159,7 @@ void natpmp::disable(error_code const& ec, mutex_t::scoped_lock& l)
|
||||||
|
|
||||||
void natpmp::delete_mapping(int index)
|
void natpmp::delete_mapping(int index)
|
||||||
{
|
{
|
||||||
mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
|
|
||||||
TORRENT_ASSERT(index < int(m_mappings.size()) && index >= 0);
|
TORRENT_ASSERT(index < int(m_mappings.size()) && index >= 0);
|
||||||
if (index >= int(m_mappings.size()) || index < 0) return;
|
if (index >= int(m_mappings.size()) || index < 0) return;
|
||||||
|
@ -179,7 +179,7 @@ void natpmp::delete_mapping(int index)
|
||||||
|
|
||||||
int natpmp::add_mapping(protocol_type p, int external_port, int local_port)
|
int natpmp::add_mapping(protocol_type p, int external_port, int local_port)
|
||||||
{
|
{
|
||||||
mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
|
|
||||||
if (m_disabled) return -1;
|
if (m_disabled) return -1;
|
||||||
|
|
||||||
|
@ -201,7 +201,7 @@ int natpmp::add_mapping(protocol_type p, int external_port, int local_port)
|
||||||
return mapping_index;
|
return mapping_index;
|
||||||
}
|
}
|
||||||
|
|
||||||
void natpmp::try_next_mapping(int i, mutex_t::scoped_lock& l)
|
void natpmp::try_next_mapping(int i, mutex::scoped_lock& l)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
#if defined(TORRENT_LOGGING) || defined(TORRENT_VERBOSE_LOGGING)
|
#if defined(TORRENT_LOGGING) || defined(TORRENT_VERBOSE_LOGGING)
|
||||||
|
@ -250,7 +250,7 @@ void natpmp::try_next_mapping(int i, mutex_t::scoped_lock& l)
|
||||||
update_mapping(m - m_mappings.begin(), l);
|
update_mapping(m - m_mappings.begin(), l);
|
||||||
}
|
}
|
||||||
|
|
||||||
void natpmp::update_mapping(int i, mutex_t::scoped_lock& l)
|
void natpmp::update_mapping(int i, mutex::scoped_lock& l)
|
||||||
{
|
{
|
||||||
if (i == m_mappings.size())
|
if (i == m_mappings.size())
|
||||||
{
|
{
|
||||||
|
@ -283,7 +283,7 @@ void natpmp::update_mapping(int i, mutex_t::scoped_lock& l)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void natpmp::send_map_request(int i, mutex_t::scoped_lock& l)
|
void natpmp::send_map_request(int i, mutex::scoped_lock& l)
|
||||||
{
|
{
|
||||||
using namespace libtorrent::detail;
|
using namespace libtorrent::detail;
|
||||||
|
|
||||||
|
@ -334,7 +334,7 @@ void natpmp::send_map_request(int i, mutex_t::scoped_lock& l)
|
||||||
void natpmp::resend_request(int i, error_code const& e)
|
void natpmp::resend_request(int i, error_code const& e)
|
||||||
{
|
{
|
||||||
if (e) return;
|
if (e) return;
|
||||||
mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
if (m_currently_mapping != i) return;
|
if (m_currently_mapping != i) return;
|
||||||
|
|
||||||
// if we're shutting down, don't retry, just move on
|
// if we're shutting down, don't retry, just move on
|
||||||
|
@ -354,7 +354,7 @@ void natpmp::resend_request(int i, error_code const& e)
|
||||||
void natpmp::on_reply(error_code const& e
|
void natpmp::on_reply(error_code const& e
|
||||||
, std::size_t bytes_transferred)
|
, std::size_t bytes_transferred)
|
||||||
{
|
{
|
||||||
mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
|
|
||||||
using namespace libtorrent::detail;
|
using namespace libtorrent::detail;
|
||||||
if (e)
|
if (e)
|
||||||
|
@ -538,7 +538,7 @@ void natpmp::update_expiration_timer()
|
||||||
void natpmp::mapping_expired(error_code const& e, int i)
|
void natpmp::mapping_expired(error_code const& e, int i)
|
||||||
{
|
{
|
||||||
if (e) return;
|
if (e) return;
|
||||||
mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
char msg[200];
|
char msg[200];
|
||||||
snprintf(msg, sizeof(msg), "mapping %u expired", i);
|
snprintf(msg, sizeof(msg), "mapping %u expired", i);
|
||||||
log(msg, l);
|
log(msg, l);
|
||||||
|
@ -549,11 +549,11 @@ void natpmp::mapping_expired(error_code const& e, int i)
|
||||||
|
|
||||||
void natpmp::close()
|
void natpmp::close()
|
||||||
{
|
{
|
||||||
mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
close_impl(l);
|
close_impl(l);
|
||||||
}
|
}
|
||||||
|
|
||||||
void natpmp::close_impl(mutex_t::scoped_lock& l)
|
void natpmp::close_impl(mutex::scoped_lock& l)
|
||||||
{
|
{
|
||||||
m_abort = true;
|
m_abort = true;
|
||||||
log("closing", l);
|
log("closing", l);
|
||||||
|
|
|
@ -988,6 +988,7 @@ namespace libtorrent
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if TORRENT_USE_I2P
|
||||||
i2p_stream* i2ps = m_socket->get<i2p_stream>();
|
i2p_stream* i2ps = m_socket->get<i2p_stream>();
|
||||||
if (!i2ps && t->torrent_file().is_i2p() && !m_ses.m_settings.allow_i2p_mixed)
|
if (!i2ps && t->torrent_file().is_i2p() && !m_ses.m_settings.allow_i2p_mixed)
|
||||||
{
|
{
|
||||||
|
@ -999,6 +1000,7 @@ namespace libtorrent
|
||||||
disconnect(error_code(errors::peer_banned, libtorrent_category), 2);
|
disconnect(error_code(errors::peer_banned, libtorrent_category), 2);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
#endif // TORRENT_USE_I2P
|
||||||
|
|
||||||
TORRENT_ASSERT(m_torrent.expired());
|
TORRENT_ASSERT(m_torrent.expired());
|
||||||
// check to make sure we don't have another connection with the same
|
// check to make sure we don't have another connection with the same
|
||||||
|
@ -2261,7 +2263,7 @@ namespace libtorrent
|
||||||
void peer_connection::on_disk_write_complete(int ret, disk_io_job const& j
|
void peer_connection::on_disk_write_complete(int ret, disk_io_job const& j
|
||||||
, peer_request p, boost::shared_ptr<torrent> t)
|
, peer_request p, boost::shared_ptr<torrent> t)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_ses.m_mutex);
|
mutex::scoped_lock l(m_ses.m_mutex);
|
||||||
|
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
|
|
||||||
|
@ -2976,7 +2978,7 @@ namespace libtorrent
|
||||||
|
|
||||||
void peer_connection::on_timeout()
|
void peer_connection::on_timeout()
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_ses.m_mutex);
|
mutex::scoped_lock l(m_ses.m_mutex);
|
||||||
|
|
||||||
TORRENT_ASSERT(m_connecting);
|
TORRENT_ASSERT(m_connecting);
|
||||||
#if defined TORRENT_VERBOSE_LOGGING || defined TORRENT_LOGGING || defined TORRENT_ERROR_LOGGING
|
#if defined TORRENT_VERBOSE_LOGGING || defined TORRENT_LOGGING || defined TORRENT_ERROR_LOGGING
|
||||||
|
@ -3811,7 +3813,7 @@ namespace libtorrent
|
||||||
|
|
||||||
void peer_connection::on_disk_read_complete(int ret, disk_io_job const& j, peer_request r)
|
void peer_connection::on_disk_read_complete(int ret, disk_io_job const& j, peer_request r)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_ses.m_mutex);
|
mutex::scoped_lock l(m_ses.m_mutex);
|
||||||
|
|
||||||
m_reading_bytes -= r.length;
|
m_reading_bytes -= r.length;
|
||||||
|
|
||||||
|
@ -4272,7 +4274,7 @@ namespace libtorrent
|
||||||
void peer_connection::on_receive_data(const error_code& error
|
void peer_connection::on_receive_data(const error_code& error
|
||||||
, std::size_t bytes_transferred)
|
, std::size_t bytes_transferred)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_ses.m_mutex);
|
mutex::scoped_lock l(m_ses.m_mutex);
|
||||||
|
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
|
|
||||||
|
@ -4443,7 +4445,7 @@ namespace libtorrent
|
||||||
|
|
||||||
void peer_connection::on_connect(int ticket)
|
void peer_connection::on_connect(int ticket)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_ses.m_mutex);
|
mutex::scoped_lock l(m_ses.m_mutex);
|
||||||
#ifdef TORRENT_DEBUG
|
#ifdef TORRENT_DEBUG
|
||||||
// in case we disconnect here, we need to
|
// in case we disconnect here, we need to
|
||||||
// keep the connection alive until the
|
// keep the connection alive until the
|
||||||
|
@ -4533,7 +4535,7 @@ namespace libtorrent
|
||||||
{
|
{
|
||||||
ptime completed = time_now();
|
ptime completed = time_now();
|
||||||
|
|
||||||
session_impl::mutex_t::scoped_lock l(m_ses.m_mutex);
|
mutex::scoped_lock l(m_ses.m_mutex);
|
||||||
|
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
|
|
||||||
|
@ -4596,7 +4598,7 @@ namespace libtorrent
|
||||||
void peer_connection::on_send_data(error_code const& error
|
void peer_connection::on_send_data(error_code const& error
|
||||||
, std::size_t bytes_transferred)
|
, std::size_t bytes_transferred)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_ses.m_mutex);
|
mutex::scoped_lock l(m_ses.m_mutex);
|
||||||
|
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
|
|
||||||
|
|
|
@ -1611,20 +1611,19 @@ namespace libtorrent
|
||||||
, piece_block(i->index, j));
|
, piece_block(i->index, j));
|
||||||
if (k != interesting_blocks.end()) continue;
|
if (k != interesting_blocks.end()) continue;
|
||||||
|
|
||||||
std::cerr << "interesting blocks:" << std::endl;
|
fprintf(stderr, "interesting blocks:\n");
|
||||||
for (k = interesting_blocks.begin(); k != interesting_blocks.end(); ++k)
|
for (k = interesting_blocks.begin(); k != interesting_blocks.end(); ++k)
|
||||||
std::cerr << "(" << k->piece_index << ", " << k->block_index << ") ";
|
fprintf(stderr, "(%d, %d)", k->piece_index, k->block_index);
|
||||||
std::cerr << std::endl;
|
fprintf(stderr, "\nnum_blocks: %d\n", num_blocks);
|
||||||
std::cerr << "num_blocks: " << num_blocks << std::endl;
|
|
||||||
|
|
||||||
for (std::vector<downloading_piece>::const_iterator l = m_downloads.begin()
|
for (std::vector<downloading_piece>::const_iterator l = m_downloads.begin()
|
||||||
, end(m_downloads.end()); l != end; ++l)
|
, end(m_downloads.end()); l != end; ++l)
|
||||||
{
|
{
|
||||||
std::cerr << l->index << " : ";
|
fprintf(stderr, "%d : ", l->index);
|
||||||
int num_blocks_in_piece = blocks_in_piece(l->index);
|
int num_blocks_in_piece = blocks_in_piece(l->index);
|
||||||
for (int m = 0; m < num_blocks_in_piece; ++m)
|
for (int m = 0; m < num_blocks_in_piece; ++m)
|
||||||
std::cerr << l->info[m].state;
|
fprintf(stderr, "%d", l->info[m].state);
|
||||||
std::cerr << std::endl;
|
fprintf(stderr, "\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
TORRENT_ASSERT(false);
|
TORRENT_ASSERT(false);
|
||||||
|
|
165
src/session.cpp
165
src/session.cpp
|
@ -253,13 +253,6 @@ namespace libtorrent
|
||||||
// turn off the filename checking in boost.filesystem
|
// turn off the filename checking in boost.filesystem
|
||||||
TORRENT_ASSERT(listen_port_range.first > 0);
|
TORRENT_ASSERT(listen_port_range.first > 0);
|
||||||
TORRENT_ASSERT(listen_port_range.first < listen_port_range.second);
|
TORRENT_ASSERT(listen_port_range.first < listen_port_range.second);
|
||||||
#ifdef TORRENT_DEBUG
|
|
||||||
// this test was added after it came to my attention
|
|
||||||
// that devstudios managed c++ failed to generate
|
|
||||||
// correct code for boost.function
|
|
||||||
boost::function0<void> test = boost::ref(*m_impl);
|
|
||||||
TORRENT_ASSERT(!test.empty());
|
|
||||||
#endif
|
|
||||||
set_alert_mask(alert_mask);
|
set_alert_mask(alert_mask);
|
||||||
#ifndef TORRENT_DISABLE_EXTENSIONS
|
#ifndef TORRENT_DISABLE_EXTENSIONS
|
||||||
if (flags & add_default_plugins)
|
if (flags & add_default_plugins)
|
||||||
|
@ -296,10 +289,6 @@ namespace libtorrent
|
||||||
{
|
{
|
||||||
#ifdef TORRENT_MEMDEBUG
|
#ifdef TORRENT_MEMDEBUG
|
||||||
start_malloc_debug();
|
start_malloc_debug();
|
||||||
#endif
|
|
||||||
#ifdef TORRENT_DEBUG
|
|
||||||
boost::function0<void> test = boost::ref(*m_impl);
|
|
||||||
TORRENT_ASSERT(!test.empty());
|
|
||||||
#endif
|
#endif
|
||||||
set_alert_mask(alert_mask);
|
set_alert_mask(alert_mask);
|
||||||
#ifndef TORRENT_DISABLE_EXTENSIONS
|
#ifndef TORRENT_DISABLE_EXTENSIONS
|
||||||
|
@ -324,7 +313,7 @@ namespace libtorrent
|
||||||
|
|
||||||
session::~session()
|
session::~session()
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
#ifdef TORRENT_MEMDEBUG
|
#ifdef TORRENT_MEMDEBUG
|
||||||
stop_malloc_debug();
|
stop_malloc_debug();
|
||||||
#endif
|
#endif
|
||||||
|
@ -339,7 +328,7 @@ namespace libtorrent
|
||||||
#ifndef TORRENT_DISABLE_EXTENSIONS
|
#ifndef TORRENT_DISABLE_EXTENSIONS
|
||||||
void session::add_extension(boost::function<boost::shared_ptr<torrent_plugin>(torrent*, void*)> ext)
|
void session::add_extension(boost::function<boost::shared_ptr<torrent_plugin>(torrent*, void*)> ext)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
m_impl->add_extension(ext);
|
m_impl->add_extension(ext);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -347,32 +336,32 @@ namespace libtorrent
|
||||||
#ifndef TORRENT_DISABLE_GEO_IP
|
#ifndef TORRENT_DISABLE_GEO_IP
|
||||||
bool session::load_asnum_db(char const* file)
|
bool session::load_asnum_db(char const* file)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
return m_impl->load_asnum_db(file);
|
return m_impl->load_asnum_db(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool session::load_country_db(char const* file)
|
bool session::load_country_db(char const* file)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
return m_impl->load_country_db(file);
|
return m_impl->load_country_db(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
int session::as_for_ip(address const& addr)
|
int session::as_for_ip(address const& addr)
|
||||||
{
|
{
|
||||||
aux::session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
aux::mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
return m_impl->as_for_ip(addr);
|
return m_impl->as_for_ip(addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef BOOST_FILESYSTEM_NARROW_ONLY
|
#ifndef BOOST_FILESYSTEM_NARROW_ONLY
|
||||||
bool session::load_asnum_db(wchar_t const* file)
|
bool session::load_asnum_db(wchar_t const* file)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
return m_impl->load_asnum_db(file);
|
return m_impl->load_asnum_db(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool session::load_country_db(wchar_t const* file)
|
bool session::load_country_db(wchar_t const* file)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
return m_impl->load_country_db(file);
|
return m_impl->load_country_db(file);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -380,74 +369,74 @@ namespace libtorrent
|
||||||
|
|
||||||
void session::load_state(entry const& ses_state)
|
void session::load_state(entry const& ses_state)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
m_impl->load_state(ses_state);
|
m_impl->load_state(ses_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
entry session::state() const
|
entry session::state() const
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
return m_impl->state();
|
return m_impl->state();
|
||||||
}
|
}
|
||||||
|
|
||||||
void session::set_ip_filter(ip_filter const& f)
|
void session::set_ip_filter(ip_filter const& f)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
m_impl->set_ip_filter(f);
|
m_impl->set_ip_filter(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
ip_filter const& session::get_ip_filter() const
|
ip_filter const& session::get_ip_filter() const
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
return m_impl->get_ip_filter();
|
return m_impl->get_ip_filter();
|
||||||
}
|
}
|
||||||
|
|
||||||
void session::set_port_filter(port_filter const& f)
|
void session::set_port_filter(port_filter const& f)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
m_impl->set_port_filter(f);
|
m_impl->set_port_filter(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
void session::set_peer_id(peer_id const& id)
|
void session::set_peer_id(peer_id const& id)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
m_impl->set_peer_id(id);
|
m_impl->set_peer_id(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
peer_id session::id() const
|
peer_id session::id() const
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
return m_impl->get_peer_id();
|
return m_impl->get_peer_id();
|
||||||
}
|
}
|
||||||
|
|
||||||
io_service& session::get_io_service()
|
io_service& session::get_io_service()
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
return m_impl->m_io_service;
|
return m_impl->m_io_service;
|
||||||
}
|
}
|
||||||
|
|
||||||
void session::set_key(int key)
|
void session::set_key(int key)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
m_impl->set_key(key);
|
m_impl->set_key(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<torrent_handle> session::get_torrents() const
|
std::vector<torrent_handle> session::get_torrents() const
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
return m_impl->get_torrents();
|
return m_impl->get_torrents();
|
||||||
}
|
}
|
||||||
|
|
||||||
torrent_handle session::find_torrent(sha1_hash const& info_hash) const
|
torrent_handle session::find_torrent(sha1_hash const& info_hash) const
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
return m_impl->find_torrent_handle(info_hash);
|
return m_impl->find_torrent_handle(info_hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef BOOST_NO_EXCEPTIONS
|
#ifndef BOOST_NO_EXCEPTIONS
|
||||||
torrent_handle session::add_torrent(add_torrent_params const& params)
|
torrent_handle session::add_torrent(add_torrent_params const& params)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
|
|
||||||
error_code ec;
|
error_code ec;
|
||||||
torrent_handle ret = m_impl->add_torrent(params, ec);
|
torrent_handle ret = m_impl->add_torrent(params, ec);
|
||||||
|
@ -458,7 +447,7 @@ namespace libtorrent
|
||||||
|
|
||||||
torrent_handle session::add_torrent(add_torrent_params const& params, error_code& ec)
|
torrent_handle session::add_torrent(add_torrent_params const& params, error_code& ec)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
return m_impl->add_torrent(params, ec);
|
return m_impl->add_torrent(params, ec);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -536,7 +525,7 @@ namespace libtorrent
|
||||||
|
|
||||||
void session::remove_torrent(const torrent_handle& h, int options)
|
void session::remove_torrent(const torrent_handle& h, int options)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
m_impl->remove_torrent(h, options);
|
m_impl->remove_torrent(h, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -544,50 +533,50 @@ namespace libtorrent
|
||||||
std::pair<int, int> const& port_range
|
std::pair<int, int> const& port_range
|
||||||
, const char* net_interface)
|
, const char* net_interface)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
return m_impl->listen_on(port_range, net_interface);
|
return m_impl->listen_on(port_range, net_interface);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned short session::listen_port() const
|
unsigned short session::listen_port() const
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
return m_impl->listen_port();
|
return m_impl->listen_port();
|
||||||
}
|
}
|
||||||
|
|
||||||
session_status session::status() const
|
session_status session::status() const
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
return m_impl->status();
|
return m_impl->status();
|
||||||
}
|
}
|
||||||
|
|
||||||
void session::pause()
|
void session::pause()
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
m_impl->pause();
|
m_impl->pause();
|
||||||
}
|
}
|
||||||
|
|
||||||
void session::resume()
|
void session::resume()
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
m_impl->resume();
|
m_impl->resume();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool session::is_paused() const
|
bool session::is_paused() const
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
return m_impl->is_paused();
|
return m_impl->is_paused();
|
||||||
}
|
}
|
||||||
|
|
||||||
void session::get_cache_info(sha1_hash const& ih
|
void session::get_cache_info(sha1_hash const& ih
|
||||||
, std::vector<cached_piece_info>& ret) const
|
, std::vector<cached_piece_info>& ret) const
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
m_impl->m_disk_thread.get_cache_info(ih, ret);
|
m_impl->m_disk_thread.get_cache_info(ih, ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
cache_status session::get_cache_status() const
|
cache_status session::get_cache_status() const
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
return m_impl->m_disk_thread.status();
|
return m_impl->m_disk_thread.status();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -595,37 +584,37 @@ namespace libtorrent
|
||||||
|
|
||||||
void session::start_dht(entry const& startup_state)
|
void session::start_dht(entry const& startup_state)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
m_impl->start_dht(startup_state);
|
m_impl->start_dht(startup_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
void session::stop_dht()
|
void session::stop_dht()
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
m_impl->stop_dht();
|
m_impl->stop_dht();
|
||||||
}
|
}
|
||||||
|
|
||||||
void session::set_dht_settings(dht_settings const& settings)
|
void session::set_dht_settings(dht_settings const& settings)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
m_impl->set_dht_settings(settings);
|
m_impl->set_dht_settings(settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
entry session::dht_state() const
|
entry session::dht_state() const
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
return m_impl->dht_state(l);
|
return m_impl->dht_state(l);
|
||||||
}
|
}
|
||||||
|
|
||||||
void session::add_dht_node(std::pair<std::string, int> const& node)
|
void session::add_dht_node(std::pair<std::string, int> const& node)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
m_impl->add_dht_node(node);
|
m_impl->add_dht_node(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
void session::add_dht_router(std::pair<std::string, int> const& node)
|
void session::add_dht_router(std::pair<std::string, int> const& node)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
m_impl->add_dht_router(node);
|
m_impl->add_dht_router(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -634,68 +623,68 @@ namespace libtorrent
|
||||||
#ifndef TORRENT_DISABLE_ENCRYPTION
|
#ifndef TORRENT_DISABLE_ENCRYPTION
|
||||||
void session::set_pe_settings(pe_settings const& settings)
|
void session::set_pe_settings(pe_settings const& settings)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
m_impl->set_pe_settings(settings);
|
m_impl->set_pe_settings(settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
pe_settings const& session::get_pe_settings() const
|
pe_settings const& session::get_pe_settings() const
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
return m_impl->get_pe_settings();
|
return m_impl->get_pe_settings();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
bool session::is_listening() const
|
bool session::is_listening() const
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
return m_impl->is_listening();
|
return m_impl->is_listening();
|
||||||
}
|
}
|
||||||
|
|
||||||
void session::set_settings(session_settings const& s)
|
void session::set_settings(session_settings const& s)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
m_impl->set_settings(s);
|
m_impl->set_settings(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
session_settings const& session::settings()
|
session_settings const& session::settings()
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
return m_impl->settings();
|
return m_impl->settings();
|
||||||
}
|
}
|
||||||
|
|
||||||
void session::set_peer_proxy(proxy_settings const& s)
|
void session::set_peer_proxy(proxy_settings const& s)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
m_impl->set_peer_proxy(s);
|
m_impl->set_peer_proxy(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
void session::set_web_seed_proxy(proxy_settings const& s)
|
void session::set_web_seed_proxy(proxy_settings const& s)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
m_impl->set_web_seed_proxy(s);
|
m_impl->set_web_seed_proxy(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
void session::set_tracker_proxy(proxy_settings const& s)
|
void session::set_tracker_proxy(proxy_settings const& s)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
m_impl->set_tracker_proxy(s);
|
m_impl->set_tracker_proxy(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
proxy_settings const& session::peer_proxy() const
|
proxy_settings const& session::peer_proxy() const
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
return m_impl->peer_proxy();
|
return m_impl->peer_proxy();
|
||||||
}
|
}
|
||||||
|
|
||||||
proxy_settings const& session::web_seed_proxy() const
|
proxy_settings const& session::web_seed_proxy() const
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
return m_impl->web_seed_proxy();
|
return m_impl->web_seed_proxy();
|
||||||
}
|
}
|
||||||
|
|
||||||
proxy_settings const& session::tracker_proxy() const
|
proxy_settings const& session::tracker_proxy() const
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
return m_impl->tracker_proxy();
|
return m_impl->tracker_proxy();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -703,13 +692,13 @@ namespace libtorrent
|
||||||
#ifndef TORRENT_DISABLE_DHT
|
#ifndef TORRENT_DISABLE_DHT
|
||||||
void session::set_dht_proxy(proxy_settings const& s)
|
void session::set_dht_proxy(proxy_settings const& s)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
m_impl->set_dht_proxy(s);
|
m_impl->set_dht_proxy(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
proxy_settings const& session::dht_proxy() const
|
proxy_settings const& session::dht_proxy() const
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
return m_impl->dht_proxy();
|
return m_impl->dht_proxy();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -717,116 +706,116 @@ namespace libtorrent
|
||||||
#if TORRENT_USE_I2P
|
#if TORRENT_USE_I2P
|
||||||
void session::set_i2p_proxy(proxy_settings const& s)
|
void session::set_i2p_proxy(proxy_settings const& s)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
m_impl->set_i2p_proxy(s);
|
m_impl->set_i2p_proxy(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
proxy_settings const& session::i2p_proxy() const
|
proxy_settings const& session::i2p_proxy() const
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
return m_impl->i2p_proxy();
|
return m_impl->i2p_proxy();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int session::max_uploads() const
|
int session::max_uploads() const
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
return m_impl->max_uploads();
|
return m_impl->max_uploads();
|
||||||
}
|
}
|
||||||
|
|
||||||
void session::set_max_uploads(int limit)
|
void session::set_max_uploads(int limit)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
m_impl->set_max_uploads(limit);
|
m_impl->set_max_uploads(limit);
|
||||||
}
|
}
|
||||||
|
|
||||||
int session::max_connections() const
|
int session::max_connections() const
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
return m_impl->max_connections();
|
return m_impl->max_connections();
|
||||||
}
|
}
|
||||||
|
|
||||||
void session::set_max_connections(int limit)
|
void session::set_max_connections(int limit)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
m_impl->set_max_connections(limit);
|
m_impl->set_max_connections(limit);
|
||||||
}
|
}
|
||||||
|
|
||||||
int session::max_half_open_connections() const
|
int session::max_half_open_connections() const
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
return m_impl->max_half_open_connections();
|
return m_impl->max_half_open_connections();
|
||||||
}
|
}
|
||||||
|
|
||||||
void session::set_max_half_open_connections(int limit)
|
void session::set_max_half_open_connections(int limit)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
m_impl->set_max_half_open_connections(limit);
|
m_impl->set_max_half_open_connections(limit);
|
||||||
}
|
}
|
||||||
|
|
||||||
int session::local_upload_rate_limit() const
|
int session::local_upload_rate_limit() const
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
return m_impl->local_upload_rate_limit();
|
return m_impl->local_upload_rate_limit();
|
||||||
}
|
}
|
||||||
|
|
||||||
int session::local_download_rate_limit() const
|
int session::local_download_rate_limit() const
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
return m_impl->local_download_rate_limit();
|
return m_impl->local_download_rate_limit();
|
||||||
}
|
}
|
||||||
|
|
||||||
int session::upload_rate_limit() const
|
int session::upload_rate_limit() const
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
return m_impl->upload_rate_limit();
|
return m_impl->upload_rate_limit();
|
||||||
}
|
}
|
||||||
|
|
||||||
int session::download_rate_limit() const
|
int session::download_rate_limit() const
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
return m_impl->download_rate_limit();
|
return m_impl->download_rate_limit();
|
||||||
}
|
}
|
||||||
|
|
||||||
void session::set_local_upload_rate_limit(int bytes_per_second)
|
void session::set_local_upload_rate_limit(int bytes_per_second)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
m_impl->set_local_upload_rate_limit(bytes_per_second);
|
m_impl->set_local_upload_rate_limit(bytes_per_second);
|
||||||
}
|
}
|
||||||
|
|
||||||
void session::set_local_download_rate_limit(int bytes_per_second)
|
void session::set_local_download_rate_limit(int bytes_per_second)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
m_impl->set_local_download_rate_limit(bytes_per_second);
|
m_impl->set_local_download_rate_limit(bytes_per_second);
|
||||||
}
|
}
|
||||||
|
|
||||||
void session::set_upload_rate_limit(int bytes_per_second)
|
void session::set_upload_rate_limit(int bytes_per_second)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
m_impl->set_upload_rate_limit(bytes_per_second);
|
m_impl->set_upload_rate_limit(bytes_per_second);
|
||||||
}
|
}
|
||||||
|
|
||||||
void session::set_download_rate_limit(int bytes_per_second)
|
void session::set_download_rate_limit(int bytes_per_second)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
m_impl->set_download_rate_limit(bytes_per_second);
|
m_impl->set_download_rate_limit(bytes_per_second);
|
||||||
}
|
}
|
||||||
|
|
||||||
int session::num_uploads() const
|
int session::num_uploads() const
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
return m_impl->num_uploads();
|
return m_impl->num_uploads();
|
||||||
}
|
}
|
||||||
|
|
||||||
int session::num_connections() const
|
int session::num_connections() const
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
return m_impl->num_connections();
|
return m_impl->num_connections();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::auto_ptr<alert> session::pop_alert()
|
std::auto_ptr<alert> session::pop_alert()
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
return m_impl->pop_alert();
|
return m_impl->pop_alert();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -844,20 +833,20 @@ namespace libtorrent
|
||||||
|
|
||||||
void session::set_alert_mask(int m)
|
void session::set_alert_mask(int m)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
m_impl->set_alert_mask(m);
|
m_impl->set_alert_mask(m);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t session::set_alert_queue_size_limit(size_t queue_size_limit_)
|
size_t session::set_alert_queue_size_limit(size_t queue_size_limit_)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
return m_impl->set_alert_queue_size_limit(queue_size_limit_);
|
return m_impl->set_alert_queue_size_limit(queue_size_limit_);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef TORRENT_NO_DEPRECATE
|
#ifndef TORRENT_NO_DEPRECATE
|
||||||
void session::set_severity_level(alert::severity_t s)
|
void session::set_severity_level(alert::severity_t s)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
int m = 0;
|
int m = 0;
|
||||||
switch (s)
|
switch (s)
|
||||||
{
|
{
|
||||||
|
@ -878,13 +867,13 @@ namespace libtorrent
|
||||||
|
|
||||||
void session::start_lsd()
|
void session::start_lsd()
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
m_impl->start_lsd();
|
m_impl->start_lsd();
|
||||||
}
|
}
|
||||||
|
|
||||||
natpmp* session::start_natpmp()
|
natpmp* session::start_natpmp()
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
if (m_impl->m_natpmp) return m_impl->m_natpmp.get();
|
if (m_impl->m_natpmp) return m_impl->m_natpmp.get();
|
||||||
|
|
||||||
// the natpmp constructor may fail and call the callbacks
|
// the natpmp constructor may fail and call the callbacks
|
||||||
|
@ -906,7 +895,7 @@ namespace libtorrent
|
||||||
|
|
||||||
upnp* session::start_upnp()
|
upnp* session::start_upnp()
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
|
|
||||||
if (m_impl->m_upnp) return m_impl->m_upnp.get();
|
if (m_impl->m_upnp) return m_impl->m_upnp.get();
|
||||||
|
|
||||||
|
@ -932,25 +921,25 @@ namespace libtorrent
|
||||||
|
|
||||||
void session::stop_lsd()
|
void session::stop_lsd()
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
m_impl->stop_lsd();
|
m_impl->stop_lsd();
|
||||||
}
|
}
|
||||||
|
|
||||||
void session::stop_natpmp()
|
void session::stop_natpmp()
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
m_impl->stop_natpmp();
|
m_impl->stop_natpmp();
|
||||||
}
|
}
|
||||||
|
|
||||||
void session::stop_upnp()
|
void session::stop_upnp()
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
m_impl->stop_upnp();
|
m_impl->stop_upnp();
|
||||||
}
|
}
|
||||||
|
|
||||||
connection_queue& session::get_connection_queue()
|
connection_queue& session::get_connection_queue()
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_impl->m_mutex);
|
mutex::scoped_lock l(m_impl->m_mutex);
|
||||||
return m_impl->m_half_open;
|
return m_impl->m_half_open;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -361,7 +361,7 @@ namespace aux {
|
||||||
m_timer.expires_from_now(milliseconds(100), ec);
|
m_timer.expires_from_now(milliseconds(100), ec);
|
||||||
m_timer.async_wait(bind(&session_impl::on_tick, this, _1));
|
m_timer.async_wait(bind(&session_impl::on_tick, this, _1));
|
||||||
|
|
||||||
m_thread.reset(new boost::thread(boost::ref(*this)));
|
m_thread.reset(new thread(boost::bind(&session_impl::main_thread, this)));
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef TORRENT_DISABLE_GEO_IP
|
#ifndef TORRENT_DISABLE_GEO_IP
|
||||||
|
@ -1240,7 +1240,7 @@ namespace aux {
|
||||||
// wake them up
|
// wake them up
|
||||||
void session_impl::on_disk_queue()
|
void session_impl::on_disk_queue()
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
|
|
||||||
for (connection_map::iterator i = m_connections.begin()
|
for (connection_map::iterator i = m_connections.begin()
|
||||||
, end(m_connections.end()); i != end; ++i)
|
, end(m_connections.end()); i != end; ++i)
|
||||||
|
@ -1254,7 +1254,7 @@ namespace aux {
|
||||||
|
|
||||||
void session_impl::on_tick(error_code const& e)
|
void session_impl::on_tick(error_code const& e)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
|
|
||||||
ptime now = time_now_hires();
|
ptime now = time_now_hires();
|
||||||
aux::g_current_time = now;
|
aux::g_current_time = now;
|
||||||
|
@ -1503,8 +1503,8 @@ namespace aux {
|
||||||
m_stat.second_tick(tick_interval_ms);
|
m_stat.second_tick(tick_interval_ms);
|
||||||
|
|
||||||
TORRENT_ASSERT(least_recently_scraped == m_torrents.end()
|
TORRENT_ASSERT(least_recently_scraped == m_torrents.end()
|
||||||
|| least_recently_scraped->second->is_paused()
|
|| (least_recently_scraped->second->is_paused()
|
||||||
&& least_recently_scraped->second->is_auto_managed());
|
&& least_recently_scraped->second->is_auto_managed()));
|
||||||
|
|
||||||
// --------------------------------------------------------------
|
// --------------------------------------------------------------
|
||||||
// scrape paused torrents that are auto managed
|
// scrape paused torrents that are auto managed
|
||||||
|
@ -2073,13 +2073,13 @@ namespace aux {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void session_impl::operator()()
|
void session_impl::main_thread()
|
||||||
{
|
{
|
||||||
eh_initializer();
|
eh_initializer();
|
||||||
|
|
||||||
if (m_listen_interface.port() != 0)
|
if (m_listen_interface.port() != 0)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
open_listen_port();
|
open_listen_port();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2091,7 +2091,7 @@ namespace aux {
|
||||||
if (ec)
|
if (ec)
|
||||||
{
|
{
|
||||||
#ifdef TORRENT_DEBUG
|
#ifdef TORRENT_DEBUG
|
||||||
std::cerr << ec.message() << "\n";
|
fprintf(stderr, "%s\n", ec.message().c_str());
|
||||||
std::string err = ec.message();
|
std::string err = ec.message();
|
||||||
#endif
|
#endif
|
||||||
TORRENT_ASSERT(false);
|
TORRENT_ASSERT(false);
|
||||||
|
@ -2104,7 +2104,7 @@ namespace aux {
|
||||||
(*m_logger) << time_now_string() << " locking mutex\n";
|
(*m_logger) << time_now_string() << " locking mutex\n";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
session_impl::mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
/*
|
/*
|
||||||
#ifdef TORRENT_DEBUG
|
#ifdef TORRENT_DEBUG
|
||||||
for (torrent_map::iterator i = m_torrents.begin();
|
for (torrent_map::iterator i = m_torrents.begin();
|
||||||
|
@ -2389,7 +2389,7 @@ namespace aux {
|
||||||
|
|
||||||
void session_impl::on_lsd_peer(tcp::endpoint peer, sha1_hash const& ih)
|
void session_impl::on_lsd_peer(tcp::endpoint peer, sha1_hash const& ih)
|
||||||
{
|
{
|
||||||
mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
|
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
|
|
||||||
|
@ -2423,7 +2423,7 @@ namespace aux {
|
||||||
void session_impl::on_port_mapping(int mapping, int port
|
void session_impl::on_port_mapping(int mapping, int port
|
||||||
, error_code const& ec, int map_transport)
|
, error_code const& ec, int map_transport)
|
||||||
{
|
{
|
||||||
mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
TORRENT_ASSERT(map_transport >= 0 && map_transport <= 1);
|
TORRENT_ASSERT(map_transport >= 0 && map_transport <= 1);
|
||||||
|
|
||||||
#ifndef TORRENT_DISABLE_DHT
|
#ifndef TORRENT_DISABLE_DHT
|
||||||
|
@ -2642,18 +2642,18 @@ namespace aux {
|
||||||
m_dht_settings.service_port = m_listen_interface.port();
|
m_dht_settings.service_port = m_listen_interface.port();
|
||||||
}
|
}
|
||||||
|
|
||||||
void session_impl::on_dht_state_callback(boost::condition& c
|
void session_impl::on_dht_state_callback(condition& c
|
||||||
, entry& e, bool& done) const
|
, entry& e, bool& done) const
|
||||||
{
|
{
|
||||||
mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
if (m_dht) e = m_dht->state();
|
if (m_dht) e = m_dht->state();
|
||||||
done = true;
|
done = true;
|
||||||
c.notify_all();
|
c.signal(l);
|
||||||
}
|
}
|
||||||
|
|
||||||
entry session_impl::dht_state(session_impl::mutex_t::scoped_lock& l) const
|
entry session_impl::dht_state(mutex::scoped_lock& l) const
|
||||||
{
|
{
|
||||||
boost::condition cond;
|
condition cond;
|
||||||
if (!m_dht) return entry();
|
if (!m_dht) return entry();
|
||||||
entry e;
|
entry e;
|
||||||
bool done = false;
|
bool done = false;
|
||||||
|
@ -2692,7 +2692,7 @@ namespace aux {
|
||||||
|
|
||||||
session_impl::~session_impl()
|
session_impl::~session_impl()
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
|
|
||||||
#if defined(TORRENT_VERBOSE_LOGGING) || defined(TORRENT_LOGGING)
|
#if defined(TORRENT_VERBOSE_LOGGING) || defined(TORRENT_LOGGING)
|
||||||
(*m_logger) << time_now_string() << "\n\n *** shutting down session *** \n\n";
|
(*m_logger) << time_now_string() << "\n\n *** shutting down session *** \n\n";
|
||||||
|
@ -2955,7 +2955,7 @@ namespace aux {
|
||||||
int num_buffers = (size + send_buffer_size - 1) / send_buffer_size;
|
int num_buffers = (size + send_buffer_size - 1) / send_buffer_size;
|
||||||
TORRENT_ASSERT(num_buffers > 0);
|
TORRENT_ASSERT(num_buffers > 0);
|
||||||
|
|
||||||
boost::mutex::scoped_lock l(m_send_buffer_mutex);
|
mutex::scoped_lock l(m_send_buffer_mutex);
|
||||||
#ifdef TORRENT_STATS
|
#ifdef TORRENT_STATS
|
||||||
TORRENT_ASSERT(m_buffer_allocations >= 0);
|
TORRENT_ASSERT(m_buffer_allocations >= 0);
|
||||||
m_buffer_allocations += num_buffers;
|
m_buffer_allocations += num_buffers;
|
||||||
|
@ -2997,7 +2997,7 @@ namespace aux {
|
||||||
int num_buffers = size / send_buffer_size;
|
int num_buffers = size / send_buffer_size;
|
||||||
TORRENT_ASSERT(num_buffers > 0);
|
TORRENT_ASSERT(num_buffers > 0);
|
||||||
|
|
||||||
boost::mutex::scoped_lock l(m_send_buffer_mutex);
|
mutex::scoped_lock l(m_send_buffer_mutex);
|
||||||
#ifdef TORRENT_STATS
|
#ifdef TORRENT_STATS
|
||||||
m_buffer_allocations -= num_buffers;
|
m_buffer_allocations -= num_buffers;
|
||||||
TORRENT_ASSERT(m_buffer_allocations >= 0);
|
TORRENT_ASSERT(m_buffer_allocations >= 0);
|
||||||
|
|
|
@ -165,7 +165,7 @@ namespace libtorrent { namespace
|
||||||
|
|
||||||
void on_read_failed_block(piece_block b, address a, int ret, disk_io_job const& j)
|
void on_read_failed_block(piece_block b, address a, int ret, disk_io_job const& j)
|
||||||
{
|
{
|
||||||
aux::session_impl::mutex_t::scoped_lock l(m_torrent.session().m_mutex);
|
mutex::scoped_lock l(m_torrent.session().m_mutex);
|
||||||
|
|
||||||
disk_buffer_holder buffer(m_torrent.session(), j.buffer);
|
disk_buffer_holder buffer(m_torrent.session(), j.buffer);
|
||||||
|
|
||||||
|
@ -246,7 +246,7 @@ namespace libtorrent { namespace
|
||||||
|
|
||||||
void on_read_ok_block(std::pair<piece_block, block_entry> b, int ret, disk_io_job const& j)
|
void on_read_ok_block(std::pair<piece_block, block_entry> b, int ret, disk_io_job const& j)
|
||||||
{
|
{
|
||||||
aux::session_impl::mutex_t::scoped_lock l(m_torrent.session().m_mutex);
|
mutex::scoped_lock l(m_torrent.session().m_mutex);
|
||||||
|
|
||||||
disk_buffer_holder buffer(m_torrent.session(), j.buffer);
|
disk_buffer_holder buffer(m_torrent.session(), j.buffer);
|
||||||
|
|
||||||
|
|
|
@ -1703,7 +1703,7 @@ ret:
|
||||||
TORRENT_ASSERT(r.length <= 16 * 1024);
|
TORRENT_ASSERT(r.length <= 16 * 1024);
|
||||||
m_io_thread.add_job(j, handler);
|
m_io_thread.add_job(j, handler);
|
||||||
#ifdef TORRENT_DEBUG
|
#ifdef TORRENT_DEBUG
|
||||||
boost::recursive_mutex::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
// if this assert is hit, it suggests
|
// if this assert is hit, it suggests
|
||||||
// that check_files was not successful
|
// that check_files was not successful
|
||||||
TORRENT_ASSERT(slot_for(r.piece) >= 0);
|
TORRENT_ASSERT(slot_for(r.piece) >= 0);
|
||||||
|
@ -1728,7 +1728,7 @@ ret:
|
||||||
TORRENT_ASSERT(r.length <= 16 * 1024);
|
TORRENT_ASSERT(r.length <= 16 * 1024);
|
||||||
m_io_thread.add_job(j, handler);
|
m_io_thread.add_job(j, handler);
|
||||||
#ifdef TORRENT_DEBUG
|
#ifdef TORRENT_DEBUG
|
||||||
boost::recursive_mutex::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
// if this assert is hit, it suggests
|
// if this assert is hit, it suggests
|
||||||
// that check_files was not successful
|
// that check_files was not successful
|
||||||
TORRENT_ASSERT(slot_for(r.piece) >= 0);
|
TORRENT_ASSERT(slot_for(r.piece) >= 0);
|
||||||
|
@ -1773,7 +1773,7 @@ ret:
|
||||||
|
|
||||||
fs::path piece_manager::save_path() const
|
fs::path piece_manager::save_path() const
|
||||||
{
|
{
|
||||||
boost::recursive_mutex::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
return m_save_path;
|
return m_save_path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1807,7 +1807,7 @@ ret:
|
||||||
|
|
||||||
void piece_manager::write_resume_data(entry& rd) const
|
void piece_manager::write_resume_data(entry& rd) const
|
||||||
{
|
{
|
||||||
boost::recursive_mutex::scoped_lock lock(m_mutex);
|
mutex::scoped_lock lock(m_mutex);
|
||||||
|
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
|
|
||||||
|
@ -1838,6 +1838,8 @@ ret:
|
||||||
|
|
||||||
void piece_manager::mark_failed(int piece_index)
|
void piece_manager::mark_failed(int piece_index)
|
||||||
{
|
{
|
||||||
|
mutex::scoped_lock lock(m_mutex);
|
||||||
|
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
|
|
||||||
if (m_storage_mode != storage_mode_compact) return;
|
if (m_storage_mode != storage_mode_compact) return;
|
||||||
|
@ -2156,7 +2158,7 @@ ret:
|
||||||
int piece_manager::check_fastresume(
|
int piece_manager::check_fastresume(
|
||||||
lazy_entry const& rd, error_code& error)
|
lazy_entry const& rd, error_code& error)
|
||||||
{
|
{
|
||||||
boost::recursive_mutex::scoped_lock lock(m_mutex);
|
mutex::scoped_lock lock(m_mutex);
|
||||||
|
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
|
|
||||||
|
@ -2867,7 +2869,7 @@ ret:
|
||||||
|
|
||||||
int piece_manager::allocate_slot_for_piece(int piece_index)
|
int piece_manager::allocate_slot_for_piece(int piece_index)
|
||||||
{
|
{
|
||||||
boost::recursive_mutex::scoped_lock lock(m_mutex);
|
mutex::scoped_lock lock(m_mutex);
|
||||||
|
|
||||||
if (m_storage_mode != storage_mode_compact) return piece_index;
|
if (m_storage_mode != storage_mode_compact) return piece_index;
|
||||||
|
|
||||||
|
@ -2982,7 +2984,7 @@ ret:
|
||||||
|
|
||||||
bool piece_manager::allocate_slots(int num_slots, bool abort_on_disk)
|
bool piece_manager::allocate_slots(int num_slots, bool abort_on_disk)
|
||||||
{
|
{
|
||||||
boost::recursive_mutex::scoped_lock lock(m_mutex);
|
mutex::scoped_lock lock(m_mutex);
|
||||||
TORRENT_ASSERT(num_slots > 0);
|
TORRENT_ASSERT(num_slots > 0);
|
||||||
|
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
|
@ -3039,8 +3041,6 @@ ret:
|
||||||
#ifdef TORRENT_DEBUG
|
#ifdef TORRENT_DEBUG
|
||||||
void piece_manager::check_invariant() const
|
void piece_manager::check_invariant() const
|
||||||
{
|
{
|
||||||
boost::recursive_mutex::scoped_lock lock(m_mutex);
|
|
||||||
|
|
||||||
TORRENT_ASSERT(m_current_slot <= m_files.num_pieces());
|
TORRENT_ASSERT(m_current_slot <= m_files.num_pieces());
|
||||||
|
|
||||||
if (m_unallocated_slots.empty()
|
if (m_unallocated_slots.empty()
|
||||||
|
|
|
@ -49,7 +49,6 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
#include <boost/filesystem/convenience.hpp>
|
#include <boost/filesystem/convenience.hpp>
|
||||||
#include <boost/bind.hpp>
|
#include <boost/bind.hpp>
|
||||||
#include <boost/thread/mutex.hpp>
|
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
#pragma warning(pop)
|
#pragma warning(pop)
|
||||||
|
@ -504,7 +503,7 @@ namespace libtorrent
|
||||||
|
|
||||||
void torrent::on_disk_read_complete(int ret, disk_io_job const& j, peer_request r, read_piece_struct* rp)
|
void torrent::on_disk_read_complete(int ret, disk_io_job const& j, peer_request r, read_piece_struct* rp)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_ses.m_mutex);
|
mutex::scoped_lock l(m_ses.m_mutex);
|
||||||
|
|
||||||
disk_buffer_holder buffer(m_ses, j.buffer);
|
disk_buffer_holder buffer(m_ses, j.buffer);
|
||||||
|
|
||||||
|
@ -575,7 +574,7 @@ namespace libtorrent
|
||||||
void torrent::on_disk_write_complete(int ret, disk_io_job const& j
|
void torrent::on_disk_write_complete(int ret, disk_io_job const& j
|
||||||
, peer_request p)
|
, peer_request p)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_ses.m_mutex);
|
mutex::scoped_lock l(m_ses.m_mutex);
|
||||||
|
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
|
|
||||||
|
@ -776,7 +775,7 @@ namespace libtorrent
|
||||||
|
|
||||||
void torrent::on_resume_data_checked(int ret, disk_io_job const& j)
|
void torrent::on_resume_data_checked(int ret, disk_io_job const& j)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_ses.m_mutex);
|
mutex::scoped_lock l(m_ses.m_mutex);
|
||||||
|
|
||||||
if (ret == piece_manager::fatal_disk_error)
|
if (ret == piece_manager::fatal_disk_error)
|
||||||
{
|
{
|
||||||
|
@ -1024,7 +1023,7 @@ namespace libtorrent
|
||||||
|
|
||||||
void torrent::on_force_recheck(int ret, disk_io_job const& j)
|
void torrent::on_force_recheck(int ret, disk_io_job const& j)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_ses.m_mutex);
|
mutex::scoped_lock l(m_ses.m_mutex);
|
||||||
|
|
||||||
if (ret == piece_manager::fatal_disk_error)
|
if (ret == piece_manager::fatal_disk_error)
|
||||||
{
|
{
|
||||||
|
@ -1056,7 +1055,7 @@ namespace libtorrent
|
||||||
|
|
||||||
void torrent::on_piece_checked(int ret, disk_io_job const& j)
|
void torrent::on_piece_checked(int ret, disk_io_job const& j)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_ses.m_mutex);
|
mutex::scoped_lock l(m_ses.m_mutex);
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
|
|
||||||
if (ret == piece_manager::disk_check_aborted)
|
if (ret == piece_manager::disk_check_aborted)
|
||||||
|
@ -1118,7 +1117,7 @@ namespace libtorrent
|
||||||
|
|
||||||
void torrent::on_tracker_announce()
|
void torrent::on_tracker_announce()
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_ses.m_mutex);
|
mutex::scoped_lock l(m_ses.m_mutex);
|
||||||
m_waiting_tracker = false;
|
m_waiting_tracker = false;
|
||||||
if (m_abort) return;
|
if (m_abort) return;
|
||||||
announce_with_tracker();
|
announce_with_tracker();
|
||||||
|
@ -1135,7 +1134,7 @@ namespace libtorrent
|
||||||
|
|
||||||
void torrent::on_lsd_announce()
|
void torrent::on_lsd_announce()
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_ses.m_mutex);
|
mutex::scoped_lock l(m_ses.m_mutex);
|
||||||
|
|
||||||
if (m_abort) return;
|
if (m_abort) return;
|
||||||
|
|
||||||
|
@ -1332,7 +1331,7 @@ namespace libtorrent
|
||||||
|
|
||||||
void torrent::tracker_warning(tracker_request const& req, std::string const& msg)
|
void torrent::tracker_warning(tracker_request const& req, std::string const& msg)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_ses.m_mutex);
|
mutex::scoped_lock l(m_ses.m_mutex);
|
||||||
|
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
|
|
||||||
|
@ -1343,7 +1342,7 @@ namespace libtorrent
|
||||||
void torrent::tracker_scrape_response(tracker_request const& req
|
void torrent::tracker_scrape_response(tracker_request const& req
|
||||||
, int complete, int incomplete, int downloaded)
|
, int complete, int incomplete, int downloaded)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_ses.m_mutex);
|
mutex::scoped_lock l(m_ses.m_mutex);
|
||||||
|
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
TORRENT_ASSERT(req.kind == tracker_request::scrape_request);
|
TORRENT_ASSERT(req.kind == tracker_request::scrape_request);
|
||||||
|
@ -1368,7 +1367,7 @@ namespace libtorrent
|
||||||
, int incomplete
|
, int incomplete
|
||||||
, address const& external_ip)
|
, address const& external_ip)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_ses.m_mutex);
|
mutex::scoped_lock l(m_ses.m_mutex);
|
||||||
|
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
TORRENT_ASSERT(r.kind == tracker_request::announce_request);
|
TORRENT_ASSERT(r.kind == tracker_request::announce_request);
|
||||||
|
@ -1517,7 +1516,7 @@ namespace libtorrent
|
||||||
#if TORRENT_USE_I2P
|
#if TORRENT_USE_I2P
|
||||||
void torrent::on_i2p_resolve(error_code const& ec, char const* dest)
|
void torrent::on_i2p_resolve(error_code const& ec, char const* dest)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_ses.m_mutex);
|
mutex::scoped_lock l(m_ses.m_mutex);
|
||||||
|
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
|
|
||||||
|
@ -1530,7 +1529,7 @@ namespace libtorrent
|
||||||
void torrent::on_peer_name_lookup(error_code const& e, tcp::resolver::iterator host
|
void torrent::on_peer_name_lookup(error_code const& e, tcp::resolver::iterator host
|
||||||
, peer_id pid)
|
, peer_id pid)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_ses.m_mutex);
|
mutex::scoped_lock l(m_ses.m_mutex);
|
||||||
|
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
|
|
||||||
|
@ -2302,7 +2301,7 @@ namespace libtorrent
|
||||||
|
|
||||||
void torrent::on_files_deleted(int ret, disk_io_job const& j)
|
void torrent::on_files_deleted(int ret, disk_io_job const& j)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_ses.m_mutex);
|
mutex::scoped_lock l(m_ses.m_mutex);
|
||||||
|
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
{
|
{
|
||||||
|
@ -2319,7 +2318,7 @@ namespace libtorrent
|
||||||
void torrent::on_files_released(int ret, disk_io_job const& j)
|
void torrent::on_files_released(int ret, disk_io_job const& j)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
session_impl::mutex_t::scoped_lock l(m_ses.m_mutex);
|
mutex::scoped_lock l(m_ses.m_mutex);
|
||||||
|
|
||||||
if (alerts().should_post<torrent_paused_alert>())
|
if (alerts().should_post<torrent_paused_alert>())
|
||||||
{
|
{
|
||||||
|
@ -2330,7 +2329,7 @@ namespace libtorrent
|
||||||
|
|
||||||
void torrent::on_save_resume_data(int ret, disk_io_job const& j)
|
void torrent::on_save_resume_data(int ret, disk_io_job const& j)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_ses.m_mutex);
|
mutex::scoped_lock l(m_ses.m_mutex);
|
||||||
|
|
||||||
if (!j.resume_data)
|
if (!j.resume_data)
|
||||||
{
|
{
|
||||||
|
@ -2346,7 +2345,7 @@ namespace libtorrent
|
||||||
|
|
||||||
void torrent::on_file_renamed(int ret, disk_io_job const& j)
|
void torrent::on_file_renamed(int ret, disk_io_job const& j)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_ses.m_mutex);
|
mutex::scoped_lock l(m_ses.m_mutex);
|
||||||
|
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
{
|
{
|
||||||
|
@ -2364,7 +2363,7 @@ namespace libtorrent
|
||||||
|
|
||||||
void torrent::on_torrent_paused(int ret, disk_io_job const& j)
|
void torrent::on_torrent_paused(int ret, disk_io_job const& j)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_ses.m_mutex);
|
mutex::scoped_lock l(m_ses.m_mutex);
|
||||||
|
|
||||||
if (alerts().should_post<torrent_paused_alert>())
|
if (alerts().should_post<torrent_paused_alert>())
|
||||||
alerts().post_alert(torrent_paused_alert(get_handle()));
|
alerts().post_alert(torrent_paused_alert(get_handle()));
|
||||||
|
@ -3063,7 +3062,7 @@ namespace libtorrent
|
||||||
void torrent::on_proxy_name_lookup(error_code const& e, tcp::resolver::iterator host
|
void torrent::on_proxy_name_lookup(error_code const& e, tcp::resolver::iterator host
|
||||||
, web_seed_entry web)
|
, web_seed_entry web)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_ses.m_mutex);
|
mutex::scoped_lock l(m_ses.m_mutex);
|
||||||
|
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
|
|
||||||
|
@ -3124,7 +3123,7 @@ namespace libtorrent
|
||||||
void torrent::on_name_lookup(error_code const& e, tcp::resolver::iterator host
|
void torrent::on_name_lookup(error_code const& e, tcp::resolver::iterator host
|
||||||
, web_seed_entry web, tcp::endpoint proxy)
|
, web_seed_entry web, tcp::endpoint proxy)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_ses.m_mutex);
|
mutex::scoped_lock l(m_ses.m_mutex);
|
||||||
|
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
|
|
||||||
|
@ -3280,7 +3279,7 @@ namespace libtorrent
|
||||||
void torrent::on_country_lookup(error_code const& error, tcp::resolver::iterator i
|
void torrent::on_country_lookup(error_code const& error, tcp::resolver::iterator i
|
||||||
, intrusive_ptr<peer_connection> p) const
|
, intrusive_ptr<peer_connection> p) const
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_ses.m_mutex);
|
mutex::scoped_lock l(m_ses.m_mutex);
|
||||||
|
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
|
|
||||||
|
@ -4348,11 +4347,11 @@ namespace libtorrent
|
||||||
|
|
||||||
void torrent::files_checked_lock()
|
void torrent::files_checked_lock()
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_ses.m_mutex);
|
mutex::scoped_lock l(m_ses.m_mutex);
|
||||||
files_checked(l);
|
files_checked(l);
|
||||||
}
|
}
|
||||||
|
|
||||||
void torrent::files_checked(session_impl::mutex_t::scoped_lock const& l)
|
void torrent::files_checked(mutex::scoped_lock const& l)
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(m_torrent_file->is_valid());
|
TORRENT_ASSERT(m_torrent_file->is_valid());
|
||||||
|
|
||||||
|
@ -4476,7 +4475,7 @@ namespace libtorrent
|
||||||
|
|
||||||
void torrent::on_storage_moved(int ret, disk_io_job const& j)
|
void torrent::on_storage_moved(int ret, disk_io_job const& j)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_ses.m_mutex);
|
mutex::scoped_lock l(m_ses.m_mutex);
|
||||||
|
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
{
|
{
|
||||||
|
@ -5523,7 +5522,7 @@ namespace libtorrent
|
||||||
void torrent::on_piece_verified(int ret, disk_io_job const& j
|
void torrent::on_piece_verified(int ret, disk_io_job const& j
|
||||||
, boost::function<void(int)> f)
|
, boost::function<void(int)> f)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_ses.m_mutex);
|
mutex::scoped_lock l(m_ses.m_mutex);
|
||||||
|
|
||||||
// return value:
|
// return value:
|
||||||
// 0: success, piece passed hash check
|
// 0: success, piece passed hash check
|
||||||
|
@ -5929,7 +5928,7 @@ namespace libtorrent
|
||||||
void torrent::tracker_request_timed_out(
|
void torrent::tracker_request_timed_out(
|
||||||
tracker_request const& r)
|
tracker_request const& r)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_ses.m_mutex);
|
mutex::scoped_lock l(m_ses.m_mutex);
|
||||||
|
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
|
|
||||||
|
@ -5970,7 +5969,7 @@ namespace libtorrent
|
||||||
void torrent::tracker_request_error(tracker_request const& r
|
void torrent::tracker_request_error(tracker_request const& r
|
||||||
, int response_code, const std::string& str)
|
, int response_code, const std::string& str)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_ses.m_mutex);
|
mutex::scoped_lock l(m_ses.m_mutex);
|
||||||
|
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
|
|
||||||
|
|
|
@ -79,19 +79,19 @@ using libtorrent::aux::session_impl;
|
||||||
#define TORRENT_FORWARD(call) \
|
#define TORRENT_FORWARD(call) \
|
||||||
boost::shared_ptr<torrent> t = m_torrent.lock(); \
|
boost::shared_ptr<torrent> t = m_torrent.lock(); \
|
||||||
if (!t) return; \
|
if (!t) return; \
|
||||||
session_impl::mutex_t::scoped_lock l(t->session().m_mutex); \
|
mutex::scoped_lock l(t->session().m_mutex); \
|
||||||
t->call
|
t->call
|
||||||
|
|
||||||
#define TORRENT_FORWARD_RETURN(call, def) \
|
#define TORRENT_FORWARD_RETURN(call, def) \
|
||||||
boost::shared_ptr<torrent> t = m_torrent.lock(); \
|
boost::shared_ptr<torrent> t = m_torrent.lock(); \
|
||||||
if (!t) return def; \
|
if (!t) return def; \
|
||||||
session_impl::mutex_t::scoped_lock l(t->session().m_mutex); \
|
mutex::scoped_lock l(t->session().m_mutex); \
|
||||||
return t->call
|
return t->call
|
||||||
|
|
||||||
#define TORRENT_FORWARD_RETURN2(call, def) \
|
#define TORRENT_FORWARD_RETURN2(call, def) \
|
||||||
boost::shared_ptr<torrent> t = m_torrent.lock(); \
|
boost::shared_ptr<torrent> t = m_torrent.lock(); \
|
||||||
if (!t) return def; \
|
if (!t) return def; \
|
||||||
session_impl::mutex_t::scoped_lock l(t->session().m_mutex); \
|
mutex::scoped_lock l(t->session().m_mutex); \
|
||||||
t->call
|
t->call
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
@ -99,19 +99,19 @@ using libtorrent::aux::session_impl;
|
||||||
#define TORRENT_FORWARD(call) \
|
#define TORRENT_FORWARD(call) \
|
||||||
boost::shared_ptr<torrent> t = m_torrent.lock(); \
|
boost::shared_ptr<torrent> t = m_torrent.lock(); \
|
||||||
if (!t) throw_invalid_handle(); \
|
if (!t) throw_invalid_handle(); \
|
||||||
session_impl::mutex_t::scoped_lock l(t->session().m_mutex); \
|
mutex::scoped_lock l(t->session().m_mutex); \
|
||||||
t->call
|
t->call
|
||||||
|
|
||||||
#define TORRENT_FORWARD_RETURN(call, def) \
|
#define TORRENT_FORWARD_RETURN(call, def) \
|
||||||
boost::shared_ptr<torrent> t = m_torrent.lock(); \
|
boost::shared_ptr<torrent> t = m_torrent.lock(); \
|
||||||
if (!t) throw_invalid_handle(); \
|
if (!t) throw_invalid_handle(); \
|
||||||
session_impl::mutex_t::scoped_lock l(t->session().m_mutex); \
|
mutex::scoped_lock l(t->session().m_mutex); \
|
||||||
return t->call
|
return t->call
|
||||||
|
|
||||||
#define TORRENT_FORWARD_RETURN2(call, def) \
|
#define TORRENT_FORWARD_RETURN2(call, def) \
|
||||||
boost::shared_ptr<torrent> t = m_torrent.lock(); \
|
boost::shared_ptr<torrent> t = m_torrent.lock(); \
|
||||||
if (!t) throw_invalid_handle(); \
|
if (!t) throw_invalid_handle(); \
|
||||||
session_impl::mutex_t::scoped_lock l(t->session().m_mutex); \
|
mutex::scoped_lock l(t->session().m_mutex); \
|
||||||
t->call
|
t->call
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -601,7 +601,7 @@ namespace libtorrent
|
||||||
#else
|
#else
|
||||||
throw_invalid_handle();
|
throw_invalid_handle();
|
||||||
#endif
|
#endif
|
||||||
session_impl::mutex_t::scoped_lock l(t->session().m_mutex);
|
mutex::scoped_lock l(t->session().m_mutex);
|
||||||
if (!t->valid_metadata())
|
if (!t->valid_metadata())
|
||||||
#ifdef BOOST_NO_EXCEPTIONS
|
#ifdef BOOST_NO_EXCEPTIONS
|
||||||
return empty;
|
return empty;
|
||||||
|
@ -647,7 +647,7 @@ namespace libtorrent
|
||||||
#else
|
#else
|
||||||
throw_invalid_handle();
|
throw_invalid_handle();
|
||||||
#endif
|
#endif
|
||||||
session_impl::mutex_t::scoped_lock l(t->session().m_mutex);
|
mutex::scoped_lock l(t->session().m_mutex);
|
||||||
|
|
||||||
peer_id id;
|
peer_id id;
|
||||||
std::fill(id.begin(), id.end(), 0);
|
std::fill(id.begin(), id.end(), 0);
|
||||||
|
|
|
@ -183,13 +183,13 @@ namespace libtorrent
|
||||||
|
|
||||||
void tracker_manager::sent_bytes(int bytes)
|
void tracker_manager::sent_bytes(int bytes)
|
||||||
{
|
{
|
||||||
// aux::session_impl::mutex_t::scoped_lock l(m_ses.m_mutex);
|
// mutex::scoped_lock l(m_ses.m_mutex);
|
||||||
m_ses.m_stat.sent_tracker_bytes(bytes);
|
m_ses.m_stat.sent_tracker_bytes(bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
void tracker_manager::received_bytes(int bytes)
|
void tracker_manager::received_bytes(int bytes)
|
||||||
{
|
{
|
||||||
aux::session_impl::mutex_t::scoped_lock l(m_ses.m_mutex);
|
mutex::scoped_lock l(m_ses.m_mutex);
|
||||||
m_ses.m_stat.received_tracker_bytes(bytes);
|
m_ses.m_stat.received_tracker_bytes(bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -269,34 +269,30 @@ namespace libtorrent
|
||||||
mutex_t::scoped_lock l(m_mutex);
|
mutex_t::scoped_lock l(m_mutex);
|
||||||
|
|
||||||
m_abort = true;
|
m_abort = true;
|
||||||
tracker_connections_t keep_connections;
|
tracker_connections_t close_connections;
|
||||||
|
|
||||||
while (!m_connections.empty())
|
for (tracker_connections_t::iterator i = m_connections.begin()
|
||||||
|
, end(m_connections.end()); i != end; ++i)
|
||||||
{
|
{
|
||||||
boost::intrusive_ptr<tracker_connection>& c = m_connections.back();
|
intrusive_ptr<tracker_connection> c = *i;
|
||||||
if (!c)
|
|
||||||
{
|
|
||||||
m_connections.pop_back();
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
tracker_request const& req = c->tracker_req();
|
tracker_request const& req = c->tracker_req();
|
||||||
if (req.event == tracker_request::stopped && !all)
|
if (req.event == tracker_request::stopped && !all)
|
||||||
{
|
|
||||||
keep_connections.push_back(c);
|
|
||||||
m_connections.pop_back();
|
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
// close will remove the entry from m_connections
|
close_connections.push_back(c);
|
||||||
// so no need to pop
|
|
||||||
|
|
||||||
#if defined TORRENT_VERBOSE_LOGGING || defined TORRENT_LOGGING || defined TORRENT_ERROR_LOGGING
|
#if defined TORRENT_VERBOSE_LOGGING || defined TORRENT_LOGGING || defined TORRENT_ERROR_LOGGING
|
||||||
boost::shared_ptr<request_callback> rc = c->requester();
|
boost::shared_ptr<request_callback> rc = c->requester();
|
||||||
if (rc) rc->debug_log("aborting: " + req.url);
|
if (rc) rc->debug_log("aborting: " + req.url);
|
||||||
#endif
|
#endif
|
||||||
c->close();
|
|
||||||
}
|
}
|
||||||
|
l.unlock();
|
||||||
|
|
||||||
std::swap(m_connections, keep_connections);
|
for (tracker_connections_t::iterator i = close_connections.begin()
|
||||||
|
, end(close_connections.end()); i != end; ++i)
|
||||||
|
{
|
||||||
|
(*i)->close();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool tracker_manager::empty() const
|
bool tracker_manager::empty() const
|
||||||
|
|
|
@ -117,7 +117,7 @@ void udp_socket::send(udp::endpoint const& ep, char const* p, int len, error_cod
|
||||||
void udp_socket::on_read(udp::socket* s, error_code const& e, std::size_t bytes_transferred)
|
void udp_socket::on_read(udp::socket* s, error_code const& e, std::size_t bytes_transferred)
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(m_magic == 0x1337);
|
TORRENT_ASSERT(m_magic == 0x1337);
|
||||||
mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
|
|
||||||
TORRENT_ASSERT(m_outstanding > 0);
|
TORRENT_ASSERT(m_outstanding > 0);
|
||||||
--m_outstanding;
|
--m_outstanding;
|
||||||
|
@ -332,7 +332,7 @@ void udp_socket::unwrap(error_code const& e, char const* buf, int size)
|
||||||
|
|
||||||
void udp_socket::close()
|
void udp_socket::close()
|
||||||
{
|
{
|
||||||
mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
TORRENT_ASSERT(m_magic == 0x1337);
|
TORRENT_ASSERT(m_magic == 0x1337);
|
||||||
|
|
||||||
error_code ec;
|
error_code ec;
|
||||||
|
@ -361,7 +361,7 @@ void udp_socket::close()
|
||||||
void udp_socket::bind(udp::endpoint const& ep, error_code& ec)
|
void udp_socket::bind(udp::endpoint const& ep, error_code& ec)
|
||||||
{
|
{
|
||||||
CHECK_MAGIC;
|
CHECK_MAGIC;
|
||||||
mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
|
|
||||||
if (m_ipv4_sock.is_open()) m_ipv4_sock.close(ec);
|
if (m_ipv4_sock.is_open()) m_ipv4_sock.close(ec);
|
||||||
#if TORRENT_USE_IPV6
|
#if TORRENT_USE_IPV6
|
||||||
|
@ -398,7 +398,7 @@ void udp_socket::bind(udp::endpoint const& ep, error_code& ec)
|
||||||
void udp_socket::bind(int port)
|
void udp_socket::bind(int port)
|
||||||
{
|
{
|
||||||
CHECK_MAGIC;
|
CHECK_MAGIC;
|
||||||
mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
|
|
||||||
error_code ec;
|
error_code ec;
|
||||||
|
|
||||||
|
@ -438,7 +438,7 @@ void udp_socket::bind(int port)
|
||||||
void udp_socket::set_proxy_settings(proxy_settings const& ps)
|
void udp_socket::set_proxy_settings(proxy_settings const& ps)
|
||||||
{
|
{
|
||||||
CHECK_MAGIC;
|
CHECK_MAGIC;
|
||||||
mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
|
|
||||||
error_code ec;
|
error_code ec;
|
||||||
m_socks5_sock.close(ec);
|
m_socks5_sock.close(ec);
|
||||||
|
@ -461,7 +461,7 @@ void udp_socket::on_name_lookup(error_code const& e, tcp::resolver::iterator i)
|
||||||
if (e) return;
|
if (e) return;
|
||||||
CHECK_MAGIC;
|
CHECK_MAGIC;
|
||||||
|
|
||||||
mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
|
|
||||||
m_proxy_addr.address(i->endpoint().address());
|
m_proxy_addr.address(i->endpoint().address());
|
||||||
m_proxy_addr.port(i->endpoint().port());
|
m_proxy_addr.port(i->endpoint().port());
|
||||||
|
@ -473,7 +473,7 @@ void udp_socket::on_name_lookup(error_code const& e, tcp::resolver::iterator i)
|
||||||
void udp_socket::on_timeout()
|
void udp_socket::on_timeout()
|
||||||
{
|
{
|
||||||
CHECK_MAGIC;
|
CHECK_MAGIC;
|
||||||
mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
|
|
||||||
error_code ec;
|
error_code ec;
|
||||||
m_socks5_sock.close(ec);
|
m_socks5_sock.close(ec);
|
||||||
|
@ -483,7 +483,7 @@ void udp_socket::on_timeout()
|
||||||
void udp_socket::on_connect(int ticket)
|
void udp_socket::on_connect(int ticket)
|
||||||
{
|
{
|
||||||
CHECK_MAGIC;
|
CHECK_MAGIC;
|
||||||
mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
|
|
||||||
m_connection_ticket = ticket;
|
m_connection_ticket = ticket;
|
||||||
error_code ec;
|
error_code ec;
|
||||||
|
@ -496,7 +496,7 @@ void udp_socket::on_connected(error_code const& e)
|
||||||
{
|
{
|
||||||
CHECK_MAGIC;
|
CHECK_MAGIC;
|
||||||
|
|
||||||
mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
m_cc.done(m_connection_ticket);
|
m_cc.done(m_connection_ticket);
|
||||||
m_connection_ticket = -1;
|
m_connection_ticket = -1;
|
||||||
if (e) return;
|
if (e) return;
|
||||||
|
@ -527,7 +527,7 @@ void udp_socket::handshake1(error_code const& e)
|
||||||
CHECK_MAGIC;
|
CHECK_MAGIC;
|
||||||
if (e) return;
|
if (e) return;
|
||||||
|
|
||||||
mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
|
|
||||||
asio::async_read(m_socks5_sock, asio::buffer(m_tmp_buf, 2)
|
asio::async_read(m_socks5_sock, asio::buffer(m_tmp_buf, 2)
|
||||||
, boost::bind(&udp_socket::handshake2, this, _1));
|
, boost::bind(&udp_socket::handshake2, this, _1));
|
||||||
|
@ -540,7 +540,7 @@ void udp_socket::handshake2(error_code const& e)
|
||||||
|
|
||||||
using namespace libtorrent::detail;
|
using namespace libtorrent::detail;
|
||||||
|
|
||||||
mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
|
|
||||||
char* p = &m_tmp_buf[0];
|
char* p = &m_tmp_buf[0];
|
||||||
int version = read_uint8(p);
|
int version = read_uint8(p);
|
||||||
|
@ -584,7 +584,7 @@ void udp_socket::handshake3(error_code const& e)
|
||||||
CHECK_MAGIC;
|
CHECK_MAGIC;
|
||||||
if (e) return;
|
if (e) return;
|
||||||
|
|
||||||
mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
|
|
||||||
asio::async_read(m_socks5_sock, asio::buffer(m_tmp_buf, 2)
|
asio::async_read(m_socks5_sock, asio::buffer(m_tmp_buf, 2)
|
||||||
, boost::bind(&udp_socket::handshake4, this, _1));
|
, boost::bind(&udp_socket::handshake4, this, _1));
|
||||||
|
@ -595,7 +595,7 @@ void udp_socket::handshake4(error_code const& e)
|
||||||
CHECK_MAGIC;
|
CHECK_MAGIC;
|
||||||
if (e) return;
|
if (e) return;
|
||||||
|
|
||||||
mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
|
|
||||||
using namespace libtorrent::detail;
|
using namespace libtorrent::detail;
|
||||||
|
|
||||||
|
@ -614,7 +614,7 @@ void udp_socket::socks_forward_udp()
|
||||||
CHECK_MAGIC;
|
CHECK_MAGIC;
|
||||||
using namespace libtorrent::detail;
|
using namespace libtorrent::detail;
|
||||||
|
|
||||||
mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
|
|
||||||
// send SOCKS5 UDP command
|
// send SOCKS5 UDP command
|
||||||
char* p = &m_tmp_buf[0];
|
char* p = &m_tmp_buf[0];
|
||||||
|
@ -634,7 +634,7 @@ void udp_socket::connect1(error_code const& e)
|
||||||
CHECK_MAGIC;
|
CHECK_MAGIC;
|
||||||
if (e) return;
|
if (e) return;
|
||||||
|
|
||||||
mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
|
|
||||||
asio::async_read(m_socks5_sock, asio::buffer(m_tmp_buf, 10)
|
asio::async_read(m_socks5_sock, asio::buffer(m_tmp_buf, 10)
|
||||||
, boost::bind(&udp_socket::connect2, this, _1));
|
, boost::bind(&udp_socket::connect2, this, _1));
|
||||||
|
@ -645,7 +645,7 @@ void udp_socket::connect2(error_code const& e)
|
||||||
CHECK_MAGIC;
|
CHECK_MAGIC;
|
||||||
if (e) return;
|
if (e) return;
|
||||||
|
|
||||||
mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
|
|
||||||
using namespace libtorrent::detail;
|
using namespace libtorrent::detail;
|
||||||
|
|
||||||
|
|
39
src/upnp.cpp
39
src/upnp.cpp
|
@ -51,7 +51,6 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include <boost/asio/ip/host_name.hpp>
|
#include <boost/asio/ip/host_name.hpp>
|
||||||
#include <boost/asio/ip/multicast.hpp>
|
#include <boost/asio/ip/multicast.hpp>
|
||||||
#endif
|
#endif
|
||||||
#include <boost/thread/mutex.hpp>
|
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
|
||||||
using boost::bind;
|
using boost::bind;
|
||||||
|
@ -106,21 +105,21 @@ upnp::~upnp()
|
||||||
|
|
||||||
void upnp::discover_device()
|
void upnp::discover_device()
|
||||||
{
|
{
|
||||||
mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
if (m_socket.num_send_sockets() == 0)
|
if (m_socket.num_send_sockets() == 0)
|
||||||
log("No network interfaces to broadcast to", l);
|
log("No network interfaces to broadcast to", l);
|
||||||
|
|
||||||
discover_device_impl(l);
|
discover_device_impl(l);
|
||||||
}
|
}
|
||||||
|
|
||||||
void upnp::log(char const* msg, mutex_t::scoped_lock& l)
|
void upnp::log(char const* msg, mutex::scoped_lock& l)
|
||||||
{
|
{
|
||||||
l.unlock();
|
l.unlock();
|
||||||
m_log_callback(msg);
|
m_log_callback(msg);
|
||||||
l.lock();
|
l.lock();
|
||||||
}
|
}
|
||||||
|
|
||||||
void upnp::discover_device_impl(mutex_t::scoped_lock& l)
|
void upnp::discover_device_impl(mutex::scoped_lock& l)
|
||||||
{
|
{
|
||||||
const char msearch[] =
|
const char msearch[] =
|
||||||
"M-SEARCH * HTTP/1.1\r\n"
|
"M-SEARCH * HTTP/1.1\r\n"
|
||||||
|
@ -157,7 +156,7 @@ void upnp::discover_device_impl(mutex_t::scoped_lock& l)
|
||||||
// returns a reference to a mapping or -1 on failure
|
// returns a reference to a mapping or -1 on failure
|
||||||
int upnp::add_mapping(upnp::protocol_type p, int external_port, int local_port)
|
int upnp::add_mapping(upnp::protocol_type p, int external_port, int local_port)
|
||||||
{
|
{
|
||||||
mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
|
|
||||||
char msg[200];
|
char msg[200];
|
||||||
snprintf(msg, sizeof(msg), "adding port map: [ protocol: %s ext_port: %u "
|
snprintf(msg, sizeof(msg), "adding port map: [ protocol: %s ext_port: %u "
|
||||||
|
@ -205,7 +204,7 @@ int upnp::add_mapping(upnp::protocol_type p, int external_port, int local_port)
|
||||||
|
|
||||||
void upnp::delete_mapping(int mapping)
|
void upnp::delete_mapping(int mapping)
|
||||||
{
|
{
|
||||||
mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
|
|
||||||
if (mapping >= int(m_mappings.size())) return;
|
if (mapping >= int(m_mappings.size())) return;
|
||||||
|
|
||||||
|
@ -250,7 +249,7 @@ void upnp::resend_request(error_code const& e)
|
||||||
|
|
||||||
boost::intrusive_ptr<upnp> me(self());
|
boost::intrusive_ptr<upnp> me(self());
|
||||||
|
|
||||||
mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
|
|
||||||
if (m_closing) return;
|
if (m_closing) return;
|
||||||
|
|
||||||
|
@ -308,7 +307,7 @@ void upnp::on_reply(udp::endpoint const& from, char* buffer
|
||||||
{
|
{
|
||||||
boost::intrusive_ptr<upnp> me(self());
|
boost::intrusive_ptr<upnp> me(self());
|
||||||
|
|
||||||
mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
|
|
||||||
using namespace libtorrent::detail;
|
using namespace libtorrent::detail;
|
||||||
|
|
||||||
|
@ -569,7 +568,7 @@ void upnp::on_reply(udp::endpoint const& from, char* buffer
|
||||||
}
|
}
|
||||||
|
|
||||||
void upnp::post(upnp::rootdevice const& d, char const* soap
|
void upnp::post(upnp::rootdevice const& d, char const* soap
|
||||||
, char const* soap_action, mutex_t::scoped_lock& l)
|
, char const* soap_action, mutex::scoped_lock& l)
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(d.magic == 1337);
|
TORRENT_ASSERT(d.magic == 1337);
|
||||||
TORRENT_ASSERT(d.upnp_connection);
|
TORRENT_ASSERT(d.upnp_connection);
|
||||||
|
@ -594,7 +593,7 @@ void upnp::post(upnp::rootdevice const& d, char const* soap
|
||||||
|
|
||||||
void upnp::create_port_mapping(http_connection& c, rootdevice& d, int i)
|
void upnp::create_port_mapping(http_connection& c, rootdevice& d, int i)
|
||||||
{
|
{
|
||||||
mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
|
|
||||||
TORRENT_ASSERT(d.magic == 1337);
|
TORRENT_ASSERT(d.magic == 1337);
|
||||||
|
|
||||||
|
@ -636,7 +635,7 @@ void upnp::create_port_mapping(http_connection& c, rootdevice& d, int i)
|
||||||
post(d, soap, soap_action, l);
|
post(d, soap, soap_action, l);
|
||||||
}
|
}
|
||||||
|
|
||||||
void upnp::next(rootdevice& d, int i, mutex_t::scoped_lock& l)
|
void upnp::next(rootdevice& d, int i, mutex::scoped_lock& l)
|
||||||
{
|
{
|
||||||
if (i < num_mappings() - 1)
|
if (i < num_mappings() - 1)
|
||||||
{
|
{
|
||||||
|
@ -653,7 +652,7 @@ void upnp::next(rootdevice& d, int i, mutex_t::scoped_lock& l)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void upnp::update_map(rootdevice& d, int i, mutex_t::scoped_lock& l)
|
void upnp::update_map(rootdevice& d, int i, mutex::scoped_lock& l)
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(d.magic == 1337);
|
TORRENT_ASSERT(d.magic == 1337);
|
||||||
TORRENT_ASSERT(i < int(d.mapping.size()));
|
TORRENT_ASSERT(i < int(d.mapping.size()));
|
||||||
|
@ -717,7 +716,7 @@ void upnp::update_map(rootdevice& d, int i, mutex_t::scoped_lock& l)
|
||||||
|
|
||||||
void upnp::delete_port_mapping(rootdevice& d, int i)
|
void upnp::delete_port_mapping(rootdevice& d, int i)
|
||||||
{
|
{
|
||||||
mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
|
|
||||||
TORRENT_ASSERT(d.magic == 1337);
|
TORRENT_ASSERT(d.magic == 1337);
|
||||||
|
|
||||||
|
@ -837,7 +836,7 @@ void upnp::on_upnp_xml(error_code const& e
|
||||||
{
|
{
|
||||||
boost::intrusive_ptr<upnp> me(self());
|
boost::intrusive_ptr<upnp> me(self());
|
||||||
|
|
||||||
mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
|
|
||||||
TORRENT_ASSERT(d.magic == 1337);
|
TORRENT_ASSERT(d.magic == 1337);
|
||||||
if (d.upnp_connection && d.upnp_connection.get() == &c)
|
if (d.upnp_connection && d.upnp_connection.get() == &c)
|
||||||
|
@ -953,7 +952,7 @@ void upnp::on_upnp_xml(error_code const& e
|
||||||
if (num_mappings() > 0) update_map(d, 0, l);
|
if (num_mappings() > 0) update_map(d, 0, l);
|
||||||
}
|
}
|
||||||
|
|
||||||
void upnp::disable(error_code const& ec, mutex_t::scoped_lock& l)
|
void upnp::disable(error_code const& ec, mutex::scoped_lock& l)
|
||||||
{
|
{
|
||||||
m_disabled = true;
|
m_disabled = true;
|
||||||
|
|
||||||
|
@ -1070,7 +1069,7 @@ void upnp::on_upnp_map_response(error_code const& e
|
||||||
{
|
{
|
||||||
boost::intrusive_ptr<upnp> me(self());
|
boost::intrusive_ptr<upnp> me(self());
|
||||||
|
|
||||||
mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
|
|
||||||
TORRENT_ASSERT(d.magic == 1337);
|
TORRENT_ASSERT(d.magic == 1337);
|
||||||
if (d.upnp_connection && d.upnp_connection.get() == &c)
|
if (d.upnp_connection && d.upnp_connection.get() == &c)
|
||||||
|
@ -1203,7 +1202,7 @@ void upnp::on_upnp_map_response(error_code const& e
|
||||||
next(d, mapping, l);
|
next(d, mapping, l);
|
||||||
}
|
}
|
||||||
|
|
||||||
void upnp::return_error(int mapping, int code, mutex_t::scoped_lock& l)
|
void upnp::return_error(int mapping, int code, mutex::scoped_lock& l)
|
||||||
{
|
{
|
||||||
int num_errors = sizeof(error_codes) / sizeof(error_codes[0]);
|
int num_errors = sizeof(error_codes) / sizeof(error_codes[0]);
|
||||||
error_code_t* end = error_codes + num_errors;
|
error_code_t* end = error_codes + num_errors;
|
||||||
|
@ -1228,7 +1227,7 @@ void upnp::on_upnp_unmap_response(error_code const& e
|
||||||
{
|
{
|
||||||
boost::intrusive_ptr<upnp> me(self());
|
boost::intrusive_ptr<upnp> me(self());
|
||||||
|
|
||||||
mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
|
|
||||||
TORRENT_ASSERT(d.magic == 1337);
|
TORRENT_ASSERT(d.magic == 1337);
|
||||||
if (d.upnp_connection && d.upnp_connection.get() == &c)
|
if (d.upnp_connection && d.upnp_connection.get() == &c)
|
||||||
|
@ -1273,7 +1272,7 @@ void upnp::on_expire(error_code const& e)
|
||||||
ptime now = time_now();
|
ptime now = time_now();
|
||||||
ptime next_expire = max_time();
|
ptime next_expire = max_time();
|
||||||
|
|
||||||
mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
|
|
||||||
for (std::set<rootdevice>::iterator i = m_devices.begin()
|
for (std::set<rootdevice>::iterator i = m_devices.begin()
|
||||||
, end(m_devices.end()); i != end; ++i)
|
, end(m_devices.end()); i != end; ++i)
|
||||||
|
@ -1306,7 +1305,7 @@ void upnp::on_expire(error_code const& e)
|
||||||
|
|
||||||
void upnp::close()
|
void upnp::close()
|
||||||
{
|
{
|
||||||
mutex_t::scoped_lock l(m_mutex);
|
mutex::scoped_lock l(m_mutex);
|
||||||
|
|
||||||
error_code ec;
|
error_code ec;
|
||||||
m_refresh_timer.cancel(ec);
|
m_refresh_timer.cancel(ec);
|
||||||
|
|
|
@ -101,18 +101,7 @@ bool print_alerts(libtorrent::session& ses, char const* name
|
||||||
|
|
||||||
void test_sleep(int millisec)
|
void test_sleep(int millisec)
|
||||||
{
|
{
|
||||||
boost::xtime xt;
|
libtorrent::sleep(millisec);
|
||||||
boost::xtime_get(&xt, boost::TIME_UTC);
|
|
||||||
boost::uint64_t nanosec = (millisec % 1000) * 1000000 + xt.nsec;
|
|
||||||
int sec = millisec / 1000;
|
|
||||||
if (nanosec > 1000000000)
|
|
||||||
{
|
|
||||||
nanosec -= 1000000000;
|
|
||||||
sec++;
|
|
||||||
}
|
|
||||||
xt.nsec = nanosec;
|
|
||||||
xt.sec += sec;
|
|
||||||
boost::thread::sleep(xt);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void stop_web_server(int port)
|
void stop_web_server(int port)
|
||||||
|
|
|
@ -37,11 +37,11 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include "libtorrent/alert_types.hpp"
|
#include "libtorrent/alert_types.hpp"
|
||||||
#include "libtorrent/aux_/session_impl.hpp"
|
#include "libtorrent/aux_/session_impl.hpp"
|
||||||
#include "libtorrent/create_torrent.hpp"
|
#include "libtorrent/create_torrent.hpp"
|
||||||
|
#include "libtorrent/thread.hpp"
|
||||||
|
|
||||||
#include <boost/utility.hpp>
|
#include <boost/utility.hpp>
|
||||||
#include <boost/filesystem/operations.hpp>
|
#include <boost/filesystem/operations.hpp>
|
||||||
#include <boost/filesystem/convenience.hpp>
|
#include <boost/filesystem/convenience.hpp>
|
||||||
#include <boost/thread/mutex.hpp>
|
|
||||||
|
|
||||||
#include "test.hpp"
|
#include "test.hpp"
|
||||||
#include "setup_transfer.hpp"
|
#include "setup_transfer.hpp"
|
||||||
|
@ -148,8 +148,7 @@ struct test_storage : storage_interface
|
||||||
{
|
{
|
||||||
if (slot == 0 || slot == 5999)
|
if (slot == 0 || slot == 5999)
|
||||||
{
|
{
|
||||||
boost::thread::sleep(boost::get_system_time()
|
sleep(2000);
|
||||||
+ boost::posix_time::seconds(2));
|
|
||||||
std::cerr << "--- starting ---\n" << std::endl;
|
std::cerr << "--- starting ---\n" << std::endl;
|
||||||
}
|
}
|
||||||
return size;
|
return size;
|
||||||
|
@ -363,7 +362,7 @@ void run_storage_tests(boost::intrusive_ptr<torrent_info> info
|
||||||
boost::shared_ptr<int> dummy(new int);
|
boost::shared_ptr<int> dummy(new int);
|
||||||
boost::intrusive_ptr<piece_manager> pm = new piece_manager(dummy, info
|
boost::intrusive_ptr<piece_manager> pm = new piece_manager(dummy, info
|
||||||
, test_path, fp, io, default_storage_constructor, storage_mode);
|
, test_path, fp, io, default_storage_constructor, storage_mode);
|
||||||
boost::mutex lock;
|
mutex lock;
|
||||||
|
|
||||||
error_code ec;
|
error_code ec;
|
||||||
bool done = false;
|
bool done = false;
|
||||||
|
@ -564,7 +563,7 @@ void test_check_files(path const& test_path
|
||||||
boost::shared_ptr<int> dummy(new int);
|
boost::shared_ptr<int> dummy(new int);
|
||||||
boost::intrusive_ptr<piece_manager> pm = new piece_manager(dummy, info
|
boost::intrusive_ptr<piece_manager> pm = new piece_manager(dummy, info
|
||||||
, test_path, fp, io, default_storage_constructor, storage_mode);
|
, test_path, fp, io, default_storage_constructor, storage_mode);
|
||||||
boost::mutex lock;
|
mutex lock;
|
||||||
|
|
||||||
error_code ec;
|
error_code ec;
|
||||||
bool done = false;
|
bool done = false;
|
||||||
|
|
Loading…
Reference in New Issue