tweak shutdown
This commit is contained in:
parent
576b81e910
commit
4e8d9b6e6d
|
@ -181,6 +181,7 @@ struct bandwidth_manager
|
||||||
, m_current_quota(0)
|
, m_current_quota(0)
|
||||||
, m_channel(channel)
|
, m_channel(channel)
|
||||||
, m_in_hand_out_bandwidth(false)
|
, m_in_hand_out_bandwidth(false)
|
||||||
|
, m_abort(false)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
void throttle(int limit) throw()
|
void throttle(int limit) throw()
|
||||||
|
@ -196,6 +197,12 @@ struct bandwidth_manager
|
||||||
return m_limit;
|
return m_limit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void close()
|
||||||
|
{
|
||||||
|
m_abort = true;
|
||||||
|
m_history_timer.cancel();
|
||||||
|
}
|
||||||
|
|
||||||
// non prioritized means that, if there's a line for bandwidth,
|
// non prioritized means that, if there's a line for bandwidth,
|
||||||
// others will cut in front of the non-prioritized peers.
|
// others will cut in front of the non-prioritized peers.
|
||||||
// this is used by web seeds
|
// this is used by web seeds
|
||||||
|
@ -275,6 +282,8 @@ private:
|
||||||
// active that will be invoked, no need to set one up
|
// active that will be invoked, no need to set one up
|
||||||
if (m_history.size() > 1) return;
|
if (m_history.size() > 1) return;
|
||||||
|
|
||||||
|
if (m_abort) return;
|
||||||
|
|
||||||
m_history_timer.expires_at(e.expires_at);
|
m_history_timer.expires_at(e.expires_at);
|
||||||
m_history_timer.async_wait(bind(&bandwidth_manager::on_history_expire, this, _1));
|
m_history_timer.async_wait(bind(&bandwidth_manager::on_history_expire, this, _1));
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
|
@ -308,7 +317,7 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
// now, wait for the next chunk to expire
|
// now, wait for the next chunk to expire
|
||||||
if (!m_history.empty())
|
if (!m_history.empty() && !m_abort)
|
||||||
{
|
{
|
||||||
m_history_timer.expires_at(m_history.back().expires_at);
|
m_history_timer.expires_at(m_history.back().expires_at);
|
||||||
m_history_timer.async_wait(bind(&bandwidth_manager::on_history_expire, this, _1));
|
m_history_timer.async_wait(bind(&bandwidth_manager::on_history_expire, this, _1));
|
||||||
|
@ -487,6 +496,7 @@ private:
|
||||||
// to prevent recursive invocations to interfere
|
// to prevent recursive invocations to interfere
|
||||||
bool m_in_hand_out_bandwidth;
|
bool m_in_hand_out_bandwidth;
|
||||||
|
|
||||||
|
bool m_abort;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -128,6 +128,8 @@ namespace libtorrent
|
||||||
|
|
||||||
#ifndef TORRENT_DISABLE_EXTENSIONS
|
#ifndef TORRENT_DISABLE_EXTENSIONS
|
||||||
void add_extension(boost::shared_ptr<torrent_plugin>);
|
void add_extension(boost::shared_ptr<torrent_plugin>);
|
||||||
|
void add_extension(boost::function<boost::shared_ptr<torrent_plugin>(torrent*, void*)> const& ext
|
||||||
|
, void* userdata);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// this is called when the torrent has metadata.
|
// this is called when the torrent has metadata.
|
||||||
|
|
|
@ -64,6 +64,8 @@ namespace libtorrent
|
||||||
struct checker_impl;
|
struct checker_impl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct torrent_plugin;
|
||||||
|
|
||||||
struct TORRENT_EXPORT duplicate_torrent: std::exception
|
struct TORRENT_EXPORT duplicate_torrent: std::exception
|
||||||
{
|
{
|
||||||
virtual const char* what() const throw()
|
virtual const char* what() const throw()
|
||||||
|
@ -279,6 +281,11 @@ namespace libtorrent
|
||||||
void remove_url_seed(std::string const& url) const;
|
void remove_url_seed(std::string const& url) const;
|
||||||
std::set<std::string> url_seeds() const;
|
std::set<std::string> url_seeds() const;
|
||||||
|
|
||||||
|
#ifndef TORRENT_DISABLE_EXTENSIONS
|
||||||
|
void add_extension(boost::function<boost::shared_ptr<torrent_plugin>(torrent*, void*)> const& ext
|
||||||
|
, void* userdata = 0);
|
||||||
|
#endif
|
||||||
|
|
||||||
bool has_metadata() const;
|
bool has_metadata() const;
|
||||||
const torrent_info& get_torrent_info() const;
|
const torrent_info& get_torrent_info() const;
|
||||||
bool is_valid() const;
|
bool is_valid() const;
|
||||||
|
|
|
@ -753,6 +753,9 @@ namespace detail
|
||||||
#endif
|
#endif
|
||||||
m_half_open.close();
|
m_half_open.close();
|
||||||
|
|
||||||
|
m_download_channel.close();
|
||||||
|
m_upload_channel.close();
|
||||||
|
|
||||||
mutex::scoped_lock l2(m_checker_impl.m_mutex);
|
mutex::scoped_lock l2(m_checker_impl.m_mutex);
|
||||||
// abort the checker thread
|
// abort the checker thread
|
||||||
m_checker_impl.m_abort = true;
|
m_checker_impl.m_abort = true;
|
||||||
|
|
|
@ -346,10 +346,34 @@ namespace libtorrent
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef TORRENT_DISABLE_EXTENSIONS
|
#ifndef TORRENT_DISABLE_EXTENSIONS
|
||||||
|
|
||||||
void torrent::add_extension(boost::shared_ptr<torrent_plugin> ext)
|
void torrent::add_extension(boost::shared_ptr<torrent_plugin> ext)
|
||||||
{
|
{
|
||||||
m_extensions.push_back(ext);
|
m_extensions.push_back(ext);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void torrent::add_extension(boost::function<boost::shared_ptr<torrent_plugin>(torrent*, void*)> const& ext
|
||||||
|
, void* userdata)
|
||||||
|
{
|
||||||
|
boost::shared_ptr<torrent_plugin> tp(ext(this, userdata));
|
||||||
|
if (!tp) return;
|
||||||
|
|
||||||
|
add_extension(tp);
|
||||||
|
|
||||||
|
for (peer_iterator i = m_connections.begin();
|
||||||
|
i != m_connections.end(); ++i)
|
||||||
|
{
|
||||||
|
peer_connection* p = *i;
|
||||||
|
boost::shared_ptr<peer_plugin> pp(tp->new_connection(p));
|
||||||
|
if (pp) p->add_extension(pp);
|
||||||
|
}
|
||||||
|
|
||||||
|
// if files are checked for this torrent, call the extension
|
||||||
|
// to let it initialize itself
|
||||||
|
if (m_connections_initialized)
|
||||||
|
tp->on_files_checked();
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// this may not be called from a constructor because of the call to
|
// this may not be called from a constructor because of the call to
|
||||||
|
|
|
@ -247,6 +247,20 @@ namespace libtorrent
|
||||||
find_torrent(m_ses, m_chk, m_info_hash)->move_storage(save_path);
|
find_torrent(m_ses, m_chk, m_info_hash)->move_storage(save_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void torrent_handle::add_extension(
|
||||||
|
boost::function<boost::shared_ptr<torrent_plugin>(torrent*, void*)> const& ext
|
||||||
|
, void* userdata)
|
||||||
|
{
|
||||||
|
INVARIANT_CHECK;
|
||||||
|
|
||||||
|
if (m_ses == 0) throw_invalid_handle();
|
||||||
|
TORRENT_ASSERT(m_chk);
|
||||||
|
|
||||||
|
session_impl::mutex_t::scoped_lock l1(m_ses->m_mutex);
|
||||||
|
mutex::scoped_lock l2(m_chk->m_mutex);
|
||||||
|
return find_torrent(m_ses, m_chk, m_info_hash)->add_extension(ext, userdata);
|
||||||
|
}
|
||||||
|
|
||||||
bool torrent_handle::has_metadata() const
|
bool torrent_handle::has_metadata() const
|
||||||
{
|
{
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
|
|
|
@ -371,6 +371,7 @@ static PyObject *torrent_init(PyObject *self, PyObject *args)
|
||||||
// Init values
|
// Init values
|
||||||
|
|
||||||
M_settings->user_agent = std::string(user_agent);
|
M_settings->user_agent = std::string(user_agent);
|
||||||
|
M_settings->stop_tracker_timeout = 3;
|
||||||
M_settings->lazy_bitfields = 1;
|
M_settings->lazy_bitfields = 1;
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
DWORD windows_version = ::GetVersion();
|
DWORD windows_version = ::GetVersion();
|
||||||
|
@ -428,9 +429,6 @@ static PyObject *torrent_init(PyObject *self, PyObject *args)
|
||||||
|
|
||||||
static PyObject *torrent_quit(PyObject *self, PyObject *args)
|
static PyObject *torrent_quit(PyObject *self, PyObject *args)
|
||||||
{
|
{
|
||||||
M_settings->stop_tracker_timeout = 3;
|
|
||||||
M_settings->tracker_receive_timeout = 3;
|
|
||||||
M_ses->set_settings(*M_settings);
|
|
||||||
printf("core: removing torrents...\r\n");
|
printf("core: removing torrents...\r\n");
|
||||||
delete M_torrents;
|
delete M_torrents;
|
||||||
printf("core: removing settings...\r\n");
|
printf("core: removing settings...\r\n");
|
||||||
|
|
|
@ -1637,13 +1637,13 @@ want to remove all seeding torrents?")):
|
||||||
self.save_column_widths()
|
self.save_column_widths()
|
||||||
self.save_window_settings()
|
self.save_window_settings()
|
||||||
self.save_tabs_order()
|
self.save_tabs_order()
|
||||||
|
gtk.main_quit()
|
||||||
enabled_plugins = ':'.join(self.plugins.get_enabled_plugins())
|
enabled_plugins = ':'.join(self.plugins.get_enabled_plugins())
|
||||||
self.config.set('enabled_plugins', enabled_plugins)
|
self.config.set('enabled_plugins', enabled_plugins)
|
||||||
self.config.save()
|
self.config.save()
|
||||||
self.plugins.shutdown_all_plugins()
|
self.plugins.shutdown_all_plugins()
|
||||||
#for the sake of windows, hide tray_icon
|
#for the sake of windows, hide tray_icon
|
||||||
self.tray_icon.set_visible(False)
|
self.tray_icon.set_visible(False)
|
||||||
gtk.main_quit()
|
|
||||||
self.manager.quit()
|
self.manager.quit()
|
||||||
|
|
||||||
## For testing purposes, create a copy of the interface
|
## For testing purposes, create a copy of the interface
|
||||||
|
|
Loading…
Reference in New Issue