move queue_position and need_save_resume into torrent_status. optimized client_test to make fewer synchronous calls and pull more out of torrent_status
This commit is contained in:
parent
80cfdc4fd8
commit
a2a2ac08a2
|
@ -2628,6 +2628,8 @@ have their positions decreased to fill in the space in the sequence.
|
|||
with the smallest numbers are the ones that are being downloaded. The smaller number,
|
||||
the closer the torrent is to the front of the line to be started.
|
||||
|
||||
The queue position is also available in the ``torrent_status``.
|
||||
|
||||
The ``queue_position_*()`` functions adjust the torrents position in the queue. Up means
|
||||
closer to the front and down means closer to the back of the queue. Top and bottom refers
|
||||
to the front and the back of the queue respectively.
|
||||
|
@ -3075,6 +3077,9 @@ It contains the following fields::
|
|||
|
||||
int time_since_upload;
|
||||
int time_since_download;
|
||||
|
||||
int queue_position;
|
||||
bool need_save_resume;
|
||||
};
|
||||
|
||||
``progress`` is a value in the range [0, 1], that represents the progress of the
|
||||
|
@ -3336,6 +3341,13 @@ saw a complete copy of this torrent.
|
|||
seconds since any peer last uploaded from this torrent and the last
|
||||
time a downloaded piece passed the hash check, respectively.
|
||||
|
||||
``queue_position`` is the position this torrent has in the download
|
||||
queue. If the torrent is a seed or finished, this is -1.
|
||||
|
||||
``need_save_resume`` is true if this torrent has unsaved changes
|
||||
to its download state and statistics since the last resume data
|
||||
was saved.
|
||||
|
||||
peer_info
|
||||
=========
|
||||
|
||||
|
|
|
@ -193,9 +193,19 @@ enum {
|
|||
|
||||
int torrent_filter = torrents_not_paused;
|
||||
|
||||
bool show_torrent(libtorrent::torrent_status const& st)
|
||||
struct torrent_entry
|
||||
{
|
||||
torrent_entry(libtorrent::torrent_handle h) : handle(h) {}
|
||||
libtorrent::torrent_handle handle;
|
||||
libtorrent::torrent_status status;
|
||||
};
|
||||
|
||||
typedef std::multimap<std::string, torrent_entry> handles_t;
|
||||
|
||||
bool show_torrent(torrent_entry const& te)
|
||||
{
|
||||
using libtorrent::torrent_status;
|
||||
torrent_status const& st = te.status;
|
||||
|
||||
switch (torrent_filter)
|
||||
{
|
||||
|
@ -547,8 +557,6 @@ void print_peer_info(std::string& out, std::vector<libtorrent::peer_info> const&
|
|||
}
|
||||
}
|
||||
|
||||
typedef std::multimap<std::string, libtorrent::torrent_handle> handles_t;
|
||||
|
||||
int listen_port = 6881;
|
||||
float preferred_ratio = 0.f;
|
||||
int allocation_mode = libtorrent::storage_mode_sparse;
|
||||
|
@ -615,7 +623,7 @@ void add_torrent(libtorrent::session& ses
|
|||
return;
|
||||
}
|
||||
|
||||
handles.insert(std::pair<const std::string, torrent_handle>(
|
||||
handles.insert(std::pair<const std::string, torrent_entry>(
|
||||
monitored_dir?std::string(torrent):std::string(), h));
|
||||
|
||||
h.set_max_connections(max_connections_per_torrent);
|
||||
|
@ -672,7 +680,7 @@ void scan_dir(std::string const& dir_path
|
|||
continue;
|
||||
}
|
||||
|
||||
torrent_handle& h = i->second;
|
||||
torrent_handle& h = i->second.handle;
|
||||
if (!h.is_valid())
|
||||
{
|
||||
handles.erase(i++);
|
||||
|
@ -689,13 +697,13 @@ void scan_dir(std::string const& dir_path
|
|||
}
|
||||
}
|
||||
|
||||
libtorrent::torrent_handle get_active_torrent(handles_t const& handles)
|
||||
torrent_entry& get_active_torrent(handles_t const& handles)
|
||||
{
|
||||
if (active_torrent >= handles.size()
|
||||
|| active_torrent < 0) return libtorrent::torrent_handle();
|
||||
|| active_torrent < 0) active_torrent = 0;
|
||||
handles_t::const_iterator i = handles.begin();
|
||||
std::advance(i, active_torrent);
|
||||
return i->second;
|
||||
return const_cast<torrent_entry&>(i->second);
|
||||
}
|
||||
|
||||
void print_alert(libtorrent::alert const* a, std::string& str)
|
||||
|
@ -764,7 +772,7 @@ void handle_alert(libtorrent::session& ses, libtorrent::alert* a
|
|||
bencode(std::back_inserter(out), *p->resume_data);
|
||||
save_file(combine_path(h.save_path(), h.name() + ".resume"), out);
|
||||
if (std::find_if(handles.begin(), handles.end()
|
||||
, boost::bind(&handles_t::value_type::second, _1) == h) == handles.end())
|
||||
, boost::bind(&torrent_entry::handle, boost::bind(&handles_t::value_type::second, _1)) == h) == handles.end())
|
||||
ses.remove_torrent(h);
|
||||
}
|
||||
}
|
||||
|
@ -772,7 +780,7 @@ void handle_alert(libtorrent::session& ses, libtorrent::alert* a
|
|||
{
|
||||
torrent_handle h = p->handle;
|
||||
if (std::find_if(handles.begin(), handles.end()
|
||||
, boost::bind(&handles_t::value_type::second, _1) == h) == handles.end())
|
||||
, boost::bind(&torrent_entry::handle, boost::bind(&handles_t::value_type::second, _1)) == h) == handles.end())
|
||||
ses.remove_torrent(h);
|
||||
}
|
||||
}
|
||||
|
@ -1160,7 +1168,7 @@ int main(int argc, char* argv[])
|
|||
// arrow up
|
||||
int prev = active_torrent;
|
||||
--active_torrent;
|
||||
while (active_torrent > 0 && !show_torrent(get_active_torrent(handles).status()))
|
||||
while (active_torrent > 0 && !show_torrent(get_active_torrent(handles)))
|
||||
--active_torrent;
|
||||
if (active_torrent < 0) active_torrent = prev;
|
||||
}
|
||||
|
@ -1169,7 +1177,7 @@ int main(int argc, char* argv[])
|
|||
// arrow down
|
||||
int prev = active_torrent;
|
||||
++active_torrent;
|
||||
while (active_torrent < handles.size() && !show_torrent(get_active_torrent(handles).status()))
|
||||
while (active_torrent < handles.size() && !show_torrent(get_active_torrent(handles)))
|
||||
++active_torrent;
|
||||
if (active_torrent >= handles.size()) active_torrent = prev;
|
||||
}
|
||||
|
@ -1189,8 +1197,8 @@ int main(int argc, char* argv[])
|
|||
for (handles_t::iterator i = handles.begin();
|
||||
i != handles.end(); ++i)
|
||||
{
|
||||
i->second.get_full_peer_list(peers);
|
||||
FILE* f = fopen(("peers_" + i->second.name()).c_str(), "w+");
|
||||
i->second.handle.get_full_peer_list(peers);
|
||||
FILE* f = fopen(("peers_" + i->second.handle.name()).c_str(), "w+");
|
||||
if (!f) break;
|
||||
for (std::vector<peer_list_entry>::iterator k = peers.begin()
|
||||
, end(peers.end()); k != end; ++k)
|
||||
|
@ -1208,22 +1216,20 @@ int main(int argc, char* argv[])
|
|||
|
||||
if (c == 'q') break;
|
||||
|
||||
if (c == 'j')
|
||||
if (c == 'j' && !handles.empty())
|
||||
{
|
||||
torrent_handle h = get_active_torrent(handles);
|
||||
if (h.is_valid()) h.force_recheck();
|
||||
get_active_torrent(handles).handle.force_recheck();
|
||||
}
|
||||
|
||||
if (c == 'r')
|
||||
if (c == 'r' && !handles.empty())
|
||||
{
|
||||
torrent_handle h = get_active_torrent(handles);
|
||||
if (h.is_valid()) h.force_reannounce();
|
||||
get_active_torrent(handles).handle.force_reannounce();
|
||||
}
|
||||
|
||||
if (c == 's')
|
||||
if (c == 's' && !handles.empty())
|
||||
{
|
||||
torrent_handle h = get_active_torrent(handles);
|
||||
if (h.is_valid()) h.set_sequential_download(!h.status().sequential_download);
|
||||
torrent_entry& te = get_active_torrent(handles);
|
||||
te.handle.set_sequential_download(!te.status.sequential_download);
|
||||
}
|
||||
|
||||
if (c == 'R')
|
||||
|
@ -1232,56 +1238,49 @@ int main(int argc, char* argv[])
|
|||
for (handles_t::iterator i = handles.begin()
|
||||
, end(handles.end()); i != end; ++i)
|
||||
{
|
||||
if (i->second.need_save_resume_data())
|
||||
i->second.save_resume_data();
|
||||
if (i->second.status.need_save_resume)
|
||||
i->second.handle.save_resume_data();
|
||||
}
|
||||
}
|
||||
|
||||
if (c == 'o')
|
||||
if (c == 'o' && !handles.empty())
|
||||
{
|
||||
torrent_handle h = get_active_torrent(handles);
|
||||
if (h.is_valid())
|
||||
torrent_entry& te = get_active_torrent(handles);
|
||||
int num_pieces = te.handle.get_torrent_info().num_pieces();
|
||||
if (num_pieces > 300) num_pieces = 300;
|
||||
for (int i = 0; i < num_pieces; ++i)
|
||||
{
|
||||
int num_pieces = h.get_torrent_info().num_pieces();
|
||||
if (num_pieces > 300) num_pieces = 300;
|
||||
for (int i = 0; i < num_pieces; ++i)
|
||||
{
|
||||
h.set_piece_deadline(i, (i+5) * 1000, torrent_handle::alert_when_available);
|
||||
}
|
||||
te.handle.set_piece_deadline(i, (i+5) * 1000, torrent_handle::alert_when_available);
|
||||
}
|
||||
}
|
||||
|
||||
if (c == 'v')
|
||||
if (c == 'v' && !handles.empty())
|
||||
{
|
||||
torrent_handle h = get_active_torrent(handles);
|
||||
if (h.is_valid()) h.scrape_tracker();
|
||||
torrent_entry& te = get_active_torrent(handles);
|
||||
te.handle.scrape_tracker();
|
||||
}
|
||||
|
||||
if (c == 'p')
|
||||
if (c == 'p' && !handles.empty())
|
||||
{
|
||||
torrent_handle h = get_active_torrent(handles);
|
||||
if (h.is_valid())
|
||||
torrent_entry& te = get_active_torrent(handles);
|
||||
if (!te.status.auto_managed && te.status.paused)
|
||||
{
|
||||
torrent_status s = h.status();
|
||||
if (!s.auto_managed && s.paused)
|
||||
{
|
||||
h.auto_managed(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
h.auto_managed(false);
|
||||
h.pause(torrent_handle::graceful_pause);
|
||||
}
|
||||
// the alert handler for save_resume_data_alert
|
||||
// will save it to disk
|
||||
if (h.need_save_resume_data()) h.save_resume_data();
|
||||
te.handle.auto_managed(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
te.handle.auto_managed(false);
|
||||
te.handle.pause(torrent_handle::graceful_pause);
|
||||
}
|
||||
// the alert handler for save_resume_data_alert
|
||||
// will save it to disk
|
||||
if (te.status.need_save_resume) te.handle.save_resume_data();
|
||||
}
|
||||
|
||||
if (c == 'c')
|
||||
if (c == 'c' && !handles.empty())
|
||||
{
|
||||
torrent_handle h = get_active_torrent(handles);
|
||||
if (h.is_valid()) h.clear_error();
|
||||
torrent_entry& te = get_active_torrent(handles);
|
||||
te.handle.clear_error();
|
||||
}
|
||||
|
||||
// toggle displays
|
||||
|
@ -1360,8 +1359,8 @@ int main(int argc, char* argv[])
|
|||
for (handles_t::iterator i = handles.begin();
|
||||
i != handles.end(); ++torrent_index)
|
||||
{
|
||||
torrent_handle& h = i->second;
|
||||
if (!h.is_valid())
|
||||
torrent_entry& te = i->second;
|
||||
if (!te.handle.is_valid())
|
||||
{
|
||||
handles.erase(i++);
|
||||
continue;
|
||||
|
@ -1371,9 +1370,10 @@ int main(int argc, char* argv[])
|
|||
++i;
|
||||
}
|
||||
|
||||
torrent_status s = h.status();
|
||||
te.status = te.handle.status();
|
||||
torrent_status const& s = te.status;
|
||||
|
||||
if (!show_torrent(s))
|
||||
if (!show_torrent(te))
|
||||
continue;
|
||||
|
||||
#ifdef ANSI_TERMINAL_COLORS
|
||||
|
@ -1392,7 +1392,7 @@ int main(int argc, char* argv[])
|
|||
out += " ";
|
||||
}
|
||||
|
||||
int queue_pos = h.queue_position();
|
||||
int queue_pos = te.status.queue_position;
|
||||
if (queue_pos == -1) out += "- ";
|
||||
else
|
||||
{
|
||||
|
@ -1403,7 +1403,7 @@ int main(int argc, char* argv[])
|
|||
if (s.paused) out += esc("34");
|
||||
else out += esc("37");
|
||||
|
||||
std::string name = h.name();
|
||||
std::string name = te.handle.name();
|
||||
if (name.size() > 40) name.resize(40);
|
||||
snprintf(str, sizeof(str), "%-40s %s ", name.c_str(), term);
|
||||
out += str;
|
||||
|
@ -1439,7 +1439,7 @@ int main(int argc, char* argv[])
|
|||
, s.up_bandwidth_queue, s.down_bandwidth_queue
|
||||
, esc("32"), add_suffix(s.all_time_download).c_str(), term
|
||||
, esc("31"), add_suffix(s.all_time_upload).c_str(), term
|
||||
, s.seed_rank, h.need_save_resume_data()?'S':' ', esc("0"));
|
||||
, s.seed_rank, te.status.need_save_resume?'S':' ', esc("0"));
|
||||
out += str;
|
||||
|
||||
if (torrent_index != active_torrent && s.state == torrent_status::seeding) continue;
|
||||
|
@ -1498,7 +1498,7 @@ int main(int argc, char* argv[])
|
|||
}
|
||||
|
||||
if (torrent_index != active_torrent) continue;
|
||||
active_handle = h;
|
||||
active_handle = te.handle;
|
||||
}
|
||||
|
||||
cache_status cs = ses.get_cache_status();
|
||||
|
@ -1755,15 +1755,15 @@ int main(int argc, char* argv[])
|
|||
for (handles_t::iterator i = handles.begin();
|
||||
i != handles.end(); ++i)
|
||||
{
|
||||
torrent_handle& h = i->second;
|
||||
if (!h.is_valid()) continue;
|
||||
torrent_status s = h.status();
|
||||
if (s.paused) continue;
|
||||
if (!s.has_metadata) continue;
|
||||
torrent_entry& te = i->second;
|
||||
if (!te.handle.is_valid()) continue;
|
||||
te.status = te.handle.status();
|
||||
if (te.status.paused) continue;
|
||||
if (!te.status.has_metadata) continue;
|
||||
|
||||
printf("saving resume data for %s\n", h.name().c_str());
|
||||
printf("saving resume data for %s\n", te.handle.name().c_str());
|
||||
// save_resume_data will generate an alert when it's done
|
||||
h.save_resume_data();
|
||||
te.handle.save_resume_data();
|
||||
++num_resume_data;
|
||||
}
|
||||
printf("waiting for resume data\n");
|
||||
|
|
|
@ -137,6 +137,7 @@ namespace libtorrent
|
|||
, last_seen_complete(0)
|
||||
, time_since_upload(0)
|
||||
, time_since_download(0)
|
||||
, queue_position(0)
|
||||
{}
|
||||
|
||||
enum state_t
|
||||
|
@ -334,6 +335,14 @@ namespace libtorrent
|
|||
// number of seconds since last upload or download activity
|
||||
int time_since_upload;
|
||||
int time_since_download;
|
||||
|
||||
// the position in the download queue where this torrent is
|
||||
// this is -1 for seeds and finished torrents
|
||||
int queue_position;
|
||||
|
||||
// true if this torrent has had changes since the last
|
||||
// time resume data was saved
|
||||
bool need_save_resume;
|
||||
};
|
||||
|
||||
struct TORRENT_EXPORT block_info
|
||||
|
|
|
@ -6819,6 +6819,9 @@ namespace libtorrent
|
|||
st.connections_limit = m_max_connections;
|
||||
// if we don't have any metadata, stop here
|
||||
|
||||
st.queue_position = queue_position();
|
||||
st.need_save_resume = need_save_resume_data();
|
||||
|
||||
st.state = (torrent_status::state_t)m_state;
|
||||
|
||||
if (!valid_metadata())
|
||||
|
|
Loading…
Reference in New Issue