fix issue with initializing settings on session construction

This commit is contained in:
arvidn 2017-11-30 16:04:03 +01:00 committed by Arvid Norberg
parent f42b63c7ea
commit 4b467f82ac
8 changed files with 60 additions and 48 deletions

View File

@ -1,4 +1,5 @@
* fix issue with initializing settings on session construction
* fix issue with receiving interested before metadata * fix issue with receiving interested before metadata
* fix IPv6 tracker announce issue * fix IPv6 tracker announce issue
* restore path sanitization behavior of ":" * restore path sanitization behavior of ":"

View File

@ -182,10 +182,10 @@ namespace libtorrent
typedef std::map<sha1_hash, boost::shared_ptr<torrent> > torrent_map; typedef std::map<sha1_hash, boost::shared_ptr<torrent> > torrent_map;
#endif #endif
session_impl(io_service& ios); session_impl(io_service& ios, settings_pack const& pack);
virtual ~session_impl(); virtual ~session_impl();
void start_session(settings_pack const& pack); void start_session();
void set_load_function(user_load_function_t fun) void set_load_function(user_load_function_t fun)
{ m_user_load_torrent = fun; } { m_user_load_torrent = fun; }
@ -620,6 +620,9 @@ namespace libtorrent
{ return &m_utp_socket_manager; } { return &m_utp_socket_manager; }
void inc_boost_connections() TORRENT_OVERRIDE { ++m_boost_connections; } void inc_boost_connections() TORRENT_OVERRIDE { ++m_boost_connections; }
// the settings for the client
aux::session_settings m_settings;
#ifndef TORRENT_NO_DEPRECATE #ifndef TORRENT_NO_DEPRECATE
// the time when the next rss feed needs updating // the time when the next rss feed needs updating
time_point m_next_rss_update; time_point m_next_rss_update;
@ -684,7 +687,7 @@ namespace libtorrent
peer_class_pool m_classes; peer_class_pool m_classes;
void init(boost::shared_ptr<settings_pack> pack); void init();
void submit_disk_jobs(); void submit_disk_jobs();
@ -693,9 +696,6 @@ namespace libtorrent
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) TORRENT_OVERRIDE; void setup_socket_buffers(socket_type& s) TORRENT_OVERRIDE;
// the settings for the client
aux::session_settings m_settings;
counters m_stats_counters; counters m_stats_counters;
// this is a pool allocator for torrent_peer objects // this is a pool allocator for torrent_peer objects

View File

@ -42,6 +42,7 @@ POSSIBILITY OF SUCH DAMAGE.
namespace libtorrent namespace libtorrent
{ {
struct settings_pack;
TORRENT_EXTRA_EXPORT void initialize_default_settings(aux::session_settings& s); TORRENT_EXTRA_EXPORT void initialize_default_settings(aux::session_settings& s);
} }
@ -71,6 +72,7 @@ namespace libtorrent { namespace aux
bool get_bool(int name) const { GET(bool, false); } bool get_bool(int name) const { GET(bool, false); }
session_settings(); session_settings();
session_settings(settings_pack const&);
private: private:
std::string m_strings[settings_pack::num_string_settings]; std::string m_strings[settings_pack::num_string_settings];

View File

@ -66,6 +66,7 @@ namespace libtorrent
TORRENT_EXTRA_EXPORT boost::shared_ptr<settings_pack> load_pack_from_dict(bdecode_node const& settings); TORRENT_EXTRA_EXPORT boost::shared_ptr<settings_pack> load_pack_from_dict(bdecode_node const& settings);
TORRENT_EXTRA_EXPORT void save_settings_to_dict(aux::session_settings const& s, entry::dictionary_type& sett); TORRENT_EXTRA_EXPORT void save_settings_to_dict(aux::session_settings const& s, entry::dictionary_type& sett);
TORRENT_EXTRA_EXPORT void apply_pack(settings_pack const* pack, aux::session_settings& sett, aux::session_impl* ses = 0); TORRENT_EXTRA_EXPORT void apply_pack(settings_pack const* pack, aux::session_settings& sett, aux::session_impl* ses = 0);
TORRENT_EXTRA_EXPORT void run_all_updates(aux::session_impl& ses);
TORRENT_EXPORT int setting_by_name(std::string const& name); TORRENT_EXPORT int setting_by_name(std::string const& name);
TORRENT_EXPORT char const* name_for_setting(int s); TORRENT_EXPORT char const* name_for_setting(int s);

View File

@ -347,7 +347,7 @@ namespace libtorrent
ios = m_io_service.get(); ios = m_io_service.get();
} }
m_impl = boost::make_shared<session_impl>(boost::ref(*ios)); m_impl = boost::make_shared<session_impl>(boost::ref(*ios), boost::ref(pack));
*static_cast<session_handle*>(this) = session_handle(m_impl.get()); *static_cast<session_handle*>(this) = session_handle(m_impl.get());
#ifndef TORRENT_DISABLE_EXTENSIONS #ifndef TORRENT_DISABLE_EXTENSIONS
@ -361,7 +361,7 @@ namespace libtorrent
TORRENT_UNUSED(flags); TORRENT_UNUSED(flags);
#endif #endif
m_impl->start_session(pack); m_impl->start_session();
if (internal_executor) if (internal_executor)
{ {

View File

@ -336,21 +336,20 @@ namespace aux {
} // anonymous namesoace } // anonymous namesoace
#endif #endif
session_impl::session_impl(io_service& ios) session_impl::session_impl(io_service& ios, settings_pack const& pack)
: : m_settings(pack)
#ifndef TORRENT_NO_DEPRECATE #ifndef TORRENT_NO_DEPRECATE
m_next_rss_update(min_time()) , m_next_rss_update(min_time())
,
#endif #endif
#ifndef TORRENT_DISABLE_POOL_ALLOCATOR #ifndef TORRENT_DISABLE_POOL_ALLOCATOR
m_send_buffers(send_buffer_size()) , m_send_buffers(send_buffer_size())
,
#endif #endif
m_io_service(ios) , m_io_service(ios)
#ifdef TORRENT_USE_OPENSSL #ifdef TORRENT_USE_OPENSSL
, m_ssl_ctx(m_io_service, boost::asio::ssl::context::sslv23) , m_ssl_ctx(m_io_service, boost::asio::ssl::context::sslv23)
#endif #endif
, m_alerts(m_settings.get_int(settings_pack::alert_queue_size), alert::all_categories) , m_alerts(m_settings.get_int(settings_pack::alert_queue_size)
, m_settings.get_int(settings_pack::alert_mask))
#ifndef TORRENT_NO_DEPRECATE #ifndef TORRENT_NO_DEPRECATE
, m_alert_pointer_pos(0) , m_alert_pointer_pos(0)
#endif #endif
@ -448,19 +447,15 @@ namespace aux {
TORRENT_ASSERT_VAL(!ec, ec); TORRENT_ASSERT_VAL(!ec, ec);
update_time_now(); update_time_now();
m_disk_thread.set_settings(&pack, m_alerts);
} }
// This function is called by the creating thread, not in the message loop's // This function is called by the creating thread, not in the message loop's
// / io_service thread. // / io_service thread.
// TODO: 2 is there a reason not to move all of this into init()? and just // TODO: 2 is there a reason not to move all of this into init()? and just
// post it to the io_service? // post it to the io_service?
void session_impl::start_session(settings_pack const& pack) void session_impl::start_session()
{ {
if (pack.has_val(settings_pack::alert_mask))
{
m_alerts.set_alert_mask(pack.get_int(settings_pack::alert_mask));
}
#ifndef TORRENT_DISABLE_LOGGING #ifndef TORRENT_DISABLE_LOGGING
session_log("start session"); session_log("start session");
#endif #endif
@ -540,13 +535,11 @@ namespace aux {
session_log(" generated peer ID: %s", m_peer_id.to_string().c_str()); session_log(" generated peer ID: %s", m_peer_id.to_string().c_str());
#endif #endif
boost::shared_ptr<settings_pack> copy = boost::make_shared<settings_pack>(pack); m_io_service.post(boost::bind(&session_impl::init, this));
m_io_service.post(boost::bind(&session_impl::init, this, copy));
} }
void session_impl::init(boost::shared_ptr<settings_pack> pack) void session_impl::init()
{ {
INVARIANT_CHECK;
// this is a debug facility // this is a debug facility
// see single_threaded in debug.hpp // see single_threaded in debug.hpp
thread_started(); thread_started();
@ -604,32 +597,20 @@ namespace aux {
session_log(" done starting session"); session_log(" done starting session");
#endif #endif
apply_settings_pack(pack); // apply all m_settings to this session
run_all_updates(*this);
// call update_* after settings set initialized // this applies unchoke settings from m_settings
recalculate_unchoke_slots();
#ifndef TORRENT_NO_DEPRECATE
update_local_download_rate();
update_local_upload_rate();
#endif
update_download_rate();
update_upload_rate();
update_connections_limit();
update_unchoke_limit();
update_disk_threads();
update_network_threads();
update_upnp();
update_natpmp();
update_lsd();
update_dht();
update_peer_fingerprint();
update_dht_bootstrap_nodes();
if (m_listen_sockets.empty()) if (m_listen_sockets.empty())
{ {
update_listen_interfaces(); update_listen_interfaces();
open_listen_port(); open_listen_port();
} }
#if TORRENT_USE_INVARIANT_CHECKS
check_invariant();
#endif
} }
void session_impl::async_resolve(std::string const& host, int flags void session_impl::async_resolve(std::string const& host, int flags
@ -4191,7 +4172,6 @@ retry:
void session_impl::recalculate_unchoke_slots() void session_impl::recalculate_unchoke_slots()
{ {
TORRENT_ASSERT(is_single_thread()); TORRENT_ASSERT(is_single_thread());
INVARIANT_CHECK;
time_point const now = aux::time_now(); time_point const now = aux::time_now();
time_duration const unchoke_interval = now - m_last_choke; time_duration const unchoke_interval = now - m_last_choke;
@ -6309,7 +6289,7 @@ retry:
void session_impl::update_queued_disk_bytes() void session_impl::update_queued_disk_bytes()
{ {
boost::uint64_t cache_size = m_settings.get_int(settings_pack::cache_size); boost::uint64_t const cache_size = m_settings.get_int(settings_pack::cache_size);
if (m_settings.get_int(settings_pack::max_queued_disk_bytes) / 16 / 1024 if (m_settings.get_int(settings_pack::max_queued_disk_bytes) / 16 / 1024
> cache_size / 2 > cache_size / 2
&& cache_size > 5 && cache_size > 5
@ -7179,7 +7159,6 @@ retry:
#else #else
std::set<peer_connection*> unique_peers; std::set<peer_connection*> unique_peers;
#endif #endif
TORRENT_ASSERT(m_settings.get_int(settings_pack::connections_limit) > 0);
int unchokes = 0; int unchokes = 0;
int unchokes_all = 0; int unchokes_all = 0;

View File

@ -31,6 +31,7 @@ POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "libtorrent/aux_/session_settings.hpp" #include "libtorrent/aux_/session_settings.hpp"
#include "libtorrent/settings_pack.hpp"
namespace libtorrent { namespace aux namespace libtorrent { namespace aux
{ {
@ -38,5 +39,11 @@ namespace libtorrent { namespace aux
{ {
initialize_default_settings(*this); initialize_default_settings(*this);
} }
session_settings::session_settings(settings_pack const& p)
{
initialize_default_settings(*this);
apply_pack(&p, *this);
}
} } } }

View File

@ -471,6 +471,28 @@ namespace libtorrent
} }
} }
void run_all_updates(aux::session_impl& ses)
{
typedef void (aux::session_impl::*fun_t)();
for (int i = 0; i < settings_pack::num_string_settings; ++i)
{
fun_t const& f = str_settings[i].fun;
if (f) (ses.*f)();
}
for (int i = 0; i < settings_pack::num_int_settings; ++i)
{
fun_t const& f = int_settings[i].fun;
if (f) (ses.*f)();
}
for (int i = 0; i < settings_pack::num_bool_settings; ++i)
{
fun_t const& f = bool_settings[i].fun;
if (f) (ses.*f)();
}
}
#ifndef TORRENT_NO_DEPRECATE #ifndef TORRENT_NO_DEPRECATE
#include "libtorrent/aux_/disable_warnings_push.hpp" #include "libtorrent/aux_/disable_warnings_push.hpp"