added pause and resume to the session. Fixes #349

This commit is contained in:
Arvid Norberg 2008-06-29 19:08:30 +00:00
parent 4271bb91d0
commit d396ab7b17
8 changed files with 99 additions and 12 deletions

View File

@ -82,6 +82,10 @@ The ``session`` class has the following synopsis::
torrent_handle add_torrent(add_torrent_params const& params);
void pause();
void resume();
bool is_paused() const;
session_proxy abort();
enum options_t
@ -194,10 +198,23 @@ returns. So, it's advised that any kind of interface (such as windows) are close
destructing the session object. Because it can take a few second for it to finish. The
timeout can be set with ``set_settings()``.
pause() resume() is_paused()
----------------------------
::
void pause();
void resume();
bool is_paused() const;
Pausing the session has the same effect as pausing every torrent in it. Resuming
will restore the torrents to their previous paused state. i.e. the session pause
state is separate from the torrent pause state. A torrent is inactive if it is
paused or if the session is paused.
abort()
-------
::
::
session_proxy abort();

View File

@ -982,6 +982,12 @@ int main(int ac, char* av[])
}
}
if (c == ' ')
{
if (ses.is_paused()) ses.resume();
else ses.pause();
}
if (c == 'm')
{
std::cout << "saving peers for torrents" << std::endl;
@ -1198,7 +1204,7 @@ int main(int ac, char* av[])
std::stringstream out;
out << "[q] quit [i] toggle peers [d] toggle downloading pieces [p] toggle paused "
"[a] toggle piece bar [s] toggle download sequential [f] toggle files "
"[j] force recheck\n"
"[j] force recheck [space] toggle session pause\n"
"[1] toggle IP [2] toggle AS [3] toggle timers [4] toggle block progress "
"[5] toggle peer rate [6] toggle failures [7] toggle send buffers\n";

View File

@ -189,6 +189,10 @@ namespace libtorrent
, int nat_transport);
bool is_aborted() const { return m_abort; }
bool is_paused() const { return m_paused; }
void pause();
void resume();
void set_ip_filter(ip_filter const& f);
void set_port_filter(port_filter const& f);
@ -454,6 +458,9 @@ namespace libtorrent
// should exit
volatile bool m_abort;
// is true if the session is paused
bool m_paused;
// the max number of unchoked peers as set by the user
int m_max_uploads;

View File

@ -212,6 +212,10 @@ namespace libtorrent
session_proxy abort() { return session_proxy(m_impl); }
void pause();
void resume();
bool is_paused() const;
session_status status() const;
cache_status get_cache_status() const;

View File

@ -195,7 +195,12 @@ namespace libtorrent
bool has_error() const { return !m_error.empty(); }
void pause();
void resume();
bool is_paused() const { return m_paused; }
void do_pause();
void do_resume();
bool is_paused() const;
bool is_torrent_paused() const { return m_paused; }
void force_recheck();
void save_resume_data();

View File

@ -324,6 +324,10 @@ namespace libtorrent
return m_impl->status();
}
void session::pause() { m_impl->pause(); }
void session::resume() { m_impl->resume(); }
bool session::is_paused() const { return m_impl->is_paused(); }
void session::get_cache_info(sha1_hash const& ih
, std::vector<cached_piece_info>& ret) const
{

View File

@ -158,6 +158,7 @@ namespace aux {
, m_listen_port_retries(listen_port_range.second - listen_port_range.first)
, m_listen_interface(address::from_string(listen_interface), listen_port_range.first)
, m_abort(false)
, m_paused(false)
, m_max_uploads(8)
, m_allowed_upload_slots(8)
, m_max_connections(200)
@ -389,6 +390,32 @@ namespace aux {
}
#endif
void session_impl::pause()
{
mutex_t::scoped_lock l(m_mutex);
if (m_paused) return;
m_paused = true;
for (torrent_map::iterator i = m_torrents.begin()
, end(m_torrents.end()); i != end; ++i)
{
torrent& t = *i->second;
if (!t.is_torrent_paused()) t.do_pause();
}
}
void session_impl::resume()
{
mutex_t::scoped_lock l(m_mutex);
if (!m_paused) return;
m_paused = false;
for (torrent_map::iterator i = m_torrents.begin()
, end(m_torrents.end()); i != end; ++i)
{
torrent& t = *i->second;
t.do_resume();
}
}
void session_impl::abort()
{
mutex_t::scoped_lock l(m_mutex);

View File

@ -761,8 +761,7 @@ namespace libtorrent
bind(&torrent::on_announce_disp, self, _1));
// announce with the local discovery service
if (!m_paused)
m_ses.announce_lsd(m_torrent_file->info_hash());
if (!is_paused()) m_ses.announce_lsd(m_torrent_file->info_hash());
}
else
{
@ -772,7 +771,7 @@ namespace libtorrent
}
#ifndef TORRENT_DISABLE_DHT
if (m_paused) return;
if (is_paused()) return;
if (!m_ses.m_dht) return;
ptime now = time_now();
if (should_announce_dht() && now - m_last_dht_announce > minutes(14))
@ -842,7 +841,7 @@ namespace libtorrent
m_just_paused = false;
return true;
}
return !m_paused && m_next_request < time_now();
return !is_paused() && m_next_request < time_now();
}
void torrent::tracker_warning(tracker_request const& req, std::string const& msg)
@ -1501,7 +1500,7 @@ namespace libtorrent
m_abort = true;
// if the torrent is paused, it doesn't need
// to announce with even=stopped again.
if (!m_paused)
if (!is_paused())
m_event = tracker_request::stopped;
// disconnect all peers and close all
// files belonging to the torrents
@ -2865,7 +2864,7 @@ namespace libtorrent
bool torrent::want_more_peers() const
{
return int(m_connections.size()) < m_max_connections
&& !m_paused
&& !is_paused()
&& m_state != torrent_status::checking_files
&& (m_state != torrent_status::queued_for_checking
|| !valid_metadata())
@ -3596,7 +3595,7 @@ namespace libtorrent
#endif
disconnect_all();
if (!m_paused)
if (!is_paused())
m_just_paused = true;
m_paused = true;
// tell the tracker that we stopped
@ -3711,11 +3710,24 @@ namespace libtorrent
}
}
bool torrent::is_paused() const
{
return m_paused || m_ses.is_paused();
}
void torrent::pause()
{
INVARIANT_CHECK;
if (m_paused) return;
m_paused = true;
if (m_ses.is_paused()) return;
do_pause();
}
void torrent::do_pause()
{
if (!is_paused()) return;
#ifndef TORRENT_DISABLE_EXTENSIONS
for (extension_list_t::iterator i = m_extensions.begin()
@ -3740,7 +3752,6 @@ namespace libtorrent
#endif
disconnect_all();
m_paused = true;
// tell the tracker that we stopped
m_event = tracker_request::stopped;
m_just_paused = true;
@ -3766,6 +3777,13 @@ namespace libtorrent
INVARIANT_CHECK;
if (!m_paused) return;
m_paused = false;
do_resume();
}
void torrent::do_resume()
{
if (is_paused()) return;
#ifndef TORRENT_DISABLE_EXTENSIONS
for (extension_list_t::iterator i = m_extensions.begin()
@ -3781,7 +3799,6 @@ namespace libtorrent
}
#endif
m_paused = false;
m_started = time_now();
m_error.clear();