*** empty log message ***

This commit is contained in:
Arvid Norberg 2004-01-17 20:04:19 +00:00
parent a75f327fee
commit 4d33080399
13 changed files with 239 additions and 101 deletions

View File

@ -12,14 +12,16 @@
<h1 class="title">libtorrent</h1> <h1 class="title">libtorrent</h1>
<table border class="table"> <table border class="table">
<colgroup> <colgroup>
<col width="37%" /> <col width="26%" />
<col width="13%" /> <col width="19%" />
<col width="19%" />
<col width="15%" />
<col width="21%" /> <col width="21%" />
<col width="29%" />
</colgroup> </colgroup>
<tbody valign="top"> <tbody valign="top">
<tr><td><a class="reference" href="http://www.sourceforge.net/projects/libtorrent">sourceforge page</a></td> <tr><td><a class="reference" href="http://www.sourceforge.net/projects/libtorrent">sourceforge page</a></td>
<td><a class="reference" href="manual.html">manual</a></td> <td><a class="reference" href="manual.html">documentation</a></td>
<td><a class="reference" href="http://sourceforge.net/tracker/?group_id=79942&amp;atid=558250">report bugs</a></td>
<td><a class="reference" href="libtorrent_screen.png">screenshot</a></td> <td><a class="reference" href="libtorrent_screen.png">screenshot</a></td>
<td><a class="reference" href="http://lists.sourceforge.net/lists/listinfo/libtorrent-discuss">mailing list</a></td> <td><a class="reference" href="http://lists.sourceforge.net/lists/listinfo/libtorrent-discuss">mailing list</a></td>
</tr> </tr>
@ -37,9 +39,22 @@ example client.</p>
<li>to be very easy to use</li> <li>to be very easy to use</li>
</ul> </ul>
</blockquote> </blockquote>
<div class="section" id="donate">
<h1><a name="donate">Donate</a></h1>
<p>Support the development of libtorrent</p>
<form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_top">
<input type="hidden" name="cmd" value="_xclick">
<input type="hidden" name="business" value="c99ang@cs.umu.se">
<input type="hidden" name="item_name" value="libtorrent">
<input type="hidden" name="return" value="http://libtorrent.sf.net">
<input type="hidden" name="currency_code" value="EUR">
<input type="hidden" name="tax" value="0">
<input type="image" src="https://www.paypal.com/images/x-click-but04.gif"
border="0" name="submit" alt="Make payments with PayPal - it's fast, free and secure!">
</form></div>
<div class="section" id="feedback"> <div class="section" id="feedback">
<h1><a name="feedback">Feedback</a></h1> <h1><a name="feedback">Feedback</a></h1>
<p>There's a <a class="reference" href="http://lists.sourceforge.net/lists/listinfo/libtorrent-discuss">mailing list</a>.</p> <p>There's a <a class="reference" href="http://lists.sourceforge.net/lists/listinfo/libtorrent-discuss">mailing list</a>, general libtorrent discussion.</p>
<p>You can usually find me as hydri in <tt class="literal"><span class="pre">#btports</span> <span class="pre">&#64;</span> <span class="pre">irc.freenode.net</span></tt>.</p> <p>You can usually find me as hydri in <tt class="literal"><span class="pre">#btports</span> <span class="pre">&#64;</span> <span class="pre">irc.freenode.net</span></tt>.</p>
</div> </div>
<div class="section" id="aknowledgements"> <div class="section" id="aknowledgements">

View File

@ -3,12 +3,13 @@ libtorrent
========== ==========
=================== ======= =========== =============== =================== ============== ============== =========== ===============
`sourceforge page`_ manual_ screenshot_ `mailing list`_ `sourceforge page`_ documentation_ `report bugs`_ screenshot_ `mailing list`_
=================== ======= =========== =============== =================== ============== ============== =========== ===============
.. _sourceforge page: http://www.sourceforge.net/projects/libtorrent .. _sourceforge page: http://www.sourceforge.net/projects/libtorrent
.. _manual: manual.html .. _documentation: manual.html
.. _`report bugs`: http://sourceforge.net/tracker/?group_id=79942&atid=558250
.. _screenshot: libtorrent_screen.png .. _screenshot: libtorrent_screen.png
.. _mailing list: http://lists.sourceforge.net/lists/listinfo/libtorrent-discuss .. _mailing list: http://lists.sourceforge.net/lists/listinfo/libtorrent-discuss
@ -26,17 +27,36 @@ The main goals of libtorrent are:
* to be very easy to use * to be very easy to use
Donate
======
Support the development of libtorrent
.. raw:: html
<form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_top">
<input type="hidden" name="cmd" value="_xclick">
<input type="hidden" name="business" value="c99ang@cs.umu.se">
<input type="hidden" name="item_name" value="libtorrent">
<input type="hidden" name="return" value="http://libtorrent.sf.net">
<input type="hidden" name="currency_code" value="EUR">
<input type="hidden" name="tax" value="0">
<input type="image" src="https://www.paypal.com/images/x-click-but04.gif"
border="0" name="submit" alt="Make payments with PayPal - it's fast, free and secure!">
</form>
Feedback Feedback
======== ========
There's a `mailing list`__. There's a `mailing list`__, general libtorrent discussion.
__ http://lists.sourceforge.net/lists/listinfo/libtorrent-discuss __ http://lists.sourceforge.net/lists/listinfo/libtorrent-discuss
You can usually find me as hydri in ``#btports @ irc.freenode.net``. You can usually find me as hydri in ``#btports @ irc.freenode.net``.
Aknowledgements Aknowledgements
=============== ===============

View File

@ -101,7 +101,7 @@ party.</li>
of a resumed torrent. Saves the storage state, piece_picker state as well as all local of a resumed torrent. Saves the storage state, piece_picker state as well as all local
peers in a separate fast-resume file.</li> peers in a separate fast-resume file.</li>
<li>Supports the extension protocol <a class="reference" href="http://nolar.com/azureus/extended.htm">described by Nolar</a>. See <a class="reference" href="#extensions">extensions</a>.</li> <li>Supports the extension protocol <a class="reference" href="http://nolar.com/azureus/extended.htm">described by Nolar</a>. See <a class="reference" href="#extensions">extensions</a>.</li>
<li>SUpports files &gt; 2 gigabytes (currently only on windows)</li> <li>Supports files &gt; 2 gigabytes (currently only on windows)</li>
</ul> </ul>
</blockquote> </blockquote>
<p>Functions that are yet to be implemented:</p> <p>Functions that are yet to be implemented:</p>
@ -133,6 +133,9 @@ boost.filesystem, boost.date_time and various other boost libraries as well as z
</div> </div>
<div class="section" id="building"> <div class="section" id="building">
<h1><a class="toc-backref" href="#id10" name="building">building</a></h1> <h1><a class="toc-backref" href="#id10" name="building">building</a></h1>
<p>Whwn building in release mode you need to define NDEBUG in order to avoid
all asserts and invariant checks within libtorrent. Developer studio does
this by default.</p>
<p>To build libtorrent you need <a class="reference" href="http://www.boost.org">boost</a> and bjam installed. <p>To build libtorrent you need <a class="reference" href="http://www.boost.org">boost</a> and bjam installed.
Then you can use <tt class="literal"><span class="pre">bjam</span></tt> to build libtorrent.</p> Then you can use <tt class="literal"><span class="pre">bjam</span></tt> to build libtorrent.</p>
<p>To make bjam work, you need to set the environment variable <tt class="literal"><span class="pre">BOOST_ROOT</span></tt> to the <p>To make bjam work, you need to set the environment variable <tt class="literal"><span class="pre">BOOST_ROOT</span></tt> to the
@ -253,7 +256,7 @@ change in the future to give more control of the listen-port.</em></p>
</div> </div>
<div class="section" id="parsing-torrent-files"> <div class="section" id="parsing-torrent-files">
<h1><a class="toc-backref" href="#id13" name="parsing-torrent-files">parsing torrent files</a></h1> <h1><a class="toc-backref" href="#id13" name="parsing-torrent-files">parsing torrent files</a></h1>
<p>The torrent files are <a class="reference" href="http://bitconjurer.org/BitTorrent/protocol.html">bencoded</a>. There are two functions in libtorrent that can encode and decode <p>The torrent files are <a class="reference" href="http://wiki.theory.org/index.php/BitTorrentSpecification">bencoded</a>. There are two functions in libtorrent that can encode and decode
bencoded data. They are:</p> bencoded data. They are:</p>
<pre class="literal-block"> <pre class="literal-block">
template&lt;class InIt&gt; entry bdecode(InIt start, InIt end); template&lt;class InIt&gt; entry bdecode(InIt start, InIt end);
@ -537,6 +540,7 @@ struct torrent_status
state_t state; state_t state;
float progress; float progress;
boost::posix_time::time_duration next_announce; boost::posix_time::time_duration next_announce;
boost::posix_time::time_duration announce_interval;
std::size_t total_download; std::size_t total_download;
std::size_t total_upload; std::size_t total_upload;
@ -587,7 +591,9 @@ is a pure seeder.</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<p><tt class="literal"><span class="pre">next_announce</span></tt> is the time until the torrent will announce itself to the tracker.</p> <p><tt class="literal"><span class="pre">next_announce</span></tt> is the time until the torrent will announce itself to the tracker. And
<tt class="literal"><span class="pre">announce_interval</span></tt> is the time the tracker want us to wait until we announce ourself
again the next time.</p>
<p><tt class="literal"><span class="pre">total_download</span></tt> and <tt class="literal"><span class="pre">total_upload</span></tt> is the number of bytes downloaded and <p><tt class="literal"><span class="pre">total_download</span></tt> and <tt class="literal"><span class="pre">total_upload</span></tt> is the number of bytes downloaded and
uploaded to all peers, accumulated, <em>this session</em> only.</p> uploaded to all peers, accumulated, <em>this session</em> only.</p>
<p><tt class="literal"><span class="pre">total_payload_download</span></tt> and <tt class="literal"><span class="pre">total_payload_upload</span></tt> counts the amount of bytes <p><tt class="literal"><span class="pre">total_payload_download</span></tt> and <tt class="literal"><span class="pre">total_payload_upload</span></tt> counts the amount of bytes

View File

@ -73,6 +73,11 @@ libtorrent is released under the BSD-license_.
building building
======== ========
Whwn building in release mode you need to define NDEBUG in order to avoid
all asserts and invariant checks within libtorrent. Developer studio does
this by default.
To build libtorrent you need boost_ and bjam installed. To build libtorrent you need boost_ and bjam installed.
Then you can use ``bjam`` to build libtorrent. Then you can use ``bjam`` to build libtorrent.
@ -220,7 +225,7 @@ bencoded data. They are::
template<class InIt> entry bdecode(InIt start, InIt end); template<class InIt> entry bdecode(InIt start, InIt end);
template<class OutIt> void bencode(OutIt out, const entry& e); template<class OutIt> void bencode(OutIt out, const entry& e);
__ http://bitconjurer.org/BitTorrent/protocol.html __ http://wiki.theory.org/index.php/BitTorrentSpecification
The entry_ class is the internal representation of the bencoded data The entry_ class is the internal representation of the bencoded data
@ -548,6 +553,7 @@ It contains the following fields::
state_t state; state_t state;
float progress; float progress;
boost::posix_time::time_duration next_announce; boost::posix_time::time_duration next_announce;
boost::posix_time::time_duration announce_interval;
std::size_t total_download; std::size_t total_download;
std::size_t total_upload; std::size_t total_upload;
@ -593,7 +599,9 @@ current task is in the ``state`` member, it will be one of the following:
| | | | | |
+--------------------------+----------------------------------------------------------+ +--------------------------+----------------------------------------------------------+
``next_announce`` is the time until the torrent will announce itself to the tracker. ``next_announce`` is the time until the torrent will announce itself to the tracker. And
``announce_interval`` is the time the tracker want us to wait until we announce ourself
again the next time.
``total_download`` and ``total_upload`` is the number of bytes downloaded and ``total_download`` and ``total_upload`` is the number of bytes downloaded and
uploaded to all peers, accumulated, *this session* only. uploaded to all peers, accumulated, *this session* only.

View File

@ -38,6 +38,7 @@ POSSIBILITY OF SUCH DAMAGE.
#include <boost/format.hpp> #include <boost/format.hpp>
#include <boost/date_time/posix_time/posix_time.hpp> #include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/filesystem/fstream.hpp> #include <boost/filesystem/fstream.hpp>
#include <boost/bind.hpp>
#include "libtorrent/entry.hpp" #include "libtorrent/entry.hpp"
#include "libtorrent/bencode.hpp" #include "libtorrent/bencode.hpp"
@ -56,7 +57,7 @@ POSSIBILITY OF SUCH DAMAGE.
bool sleep_and_input(char* c) bool sleep_and_input(char* c)
{ {
Sleep(200); Sleep(500);
if (kbhit()) if (kbhit())
{ {
*c = getch(); *c = getch();
@ -116,7 +117,7 @@ bool sleep_and_input(char* c)
fd_set set; fd_set set;
FD_ZERO(&set); FD_ZERO(&set);
FD_SET(0, &set); FD_SET(0, &set);
timeval tv = {0, 200000}; timeval tv = {0, 500000};
if (select(1, &set, 0, 0, &tv) > 0) if (select(1, &set, 0, 0, &tv) > 0)
{ {
*c = getc(stdin); *c = getc(stdin);
@ -220,7 +221,7 @@ int main(int argc, char* argv[])
// settings.proxy_port = 80; // settings.proxy_port = 80;
// settings.proxy_login = "hyd"; // settings.proxy_login = "hyd";
// settings.proxy_password = "foobar"; // settings.proxy_password = "foobar";
settings.user_agent = "example"; settings.user_agent = "client_test";
std::deque<std::string> events; std::deque<std::string> events;
@ -229,7 +230,6 @@ int main(int argc, char* argv[])
std::vector<torrent_handle> handles; std::vector<torrent_handle> handles;
session ses(6881); session ses(6881);
// // limit global upload rate to 30 kB/s
// ses.set_upload_rate_limit(30 * 1024); // ses.set_upload_rate_limit(30 * 1024);
ses.set_http_settings(settings); ses.set_http_settings(settings);
ses.set_severity_level(alert::debug); ses.set_severity_level(alert::debug);
@ -293,9 +293,13 @@ int main(int argc, char* argv[])
break; break;
} }
if(c==' ') if(c == 'r')
{ {
events.pop_back(); // force reannounce on all torrents
std::for_each(
handles.begin()
, handles.end()
, boost::bind(&torrent_handle::force_reannounce, _1));
} }
} }

View File

@ -49,8 +49,20 @@ namespace libtorrent
{ {
struct piece_checker_data; struct piece_checker_data;
} }
class session; class session;
typedef boost::int64_t size_type;
std::vector<size_type> get_filesizes(
const torrent_info& t
, const boost::filesystem::path& p);
bool match_filesizes(
const torrent_info& t
, const boost::filesystem::path& p
, const std::vector<size_type>& sizes);
struct file_allocation_failed: std::exception struct file_allocation_failed: std::exception
{ {
file_allocation_failed(const char* error_msg): m_msg(error_msg) {} file_allocation_failed(const char* error_msg): m_msg(error_msg) {}

View File

@ -92,6 +92,9 @@ namespace libtorrent
state_t state; state_t state;
float progress; float progress;
boost::posix_time::time_duration next_announce; boost::posix_time::time_duration next_announce;
boost::posix_time::time_duration announce_interval;
// TODO: add name of tracker that is currently used
// transferred this session! // transferred this session!
// total, payload plus protocol // total, payload plus protocol

View File

@ -1527,6 +1527,8 @@ namespace libtorrent
assert(m_send_quota_left != 0); assert(m_send_quota_left != 0);
if (m_send_quota_left > 0) if (m_send_quota_left > 0)
amount_to_send = std::min(m_send_quota_left, amount_to_send); amount_to_send = std::min(m_send_quota_left, amount_to_send);
// we have data that's scheduled for sending // we have data that's scheduled for sending
int sent = m_socket->send( int sent = m_socket->send(
&m_send_buffer[0] &m_send_buffer[0]
@ -1540,6 +1542,7 @@ namespace libtorrent
m_send_quota_left -= sent; m_send_quota_left -= sent;
} }
// manage the payload markers
int amount_payload = 0; int amount_payload = 0;
if (!m_payloads.empty()) if (!m_payloads.empty())
{ {
@ -1596,6 +1599,7 @@ namespace libtorrent
assert(m_added_to_selector); assert(m_added_to_selector);
send_buffer_updated(); send_buffer_updated();
/*
#ifndef NDEBUG #ifndef NDEBUG
if (has_data()) if (has_data())
{ {
@ -1605,6 +1609,7 @@ namespace libtorrent
} }
} }
#endif #endif
*/
} }

View File

@ -719,8 +719,19 @@ namespace libtorrent
// called when a peer is no longer interested in us // called when a peer is no longer interested in us
void policy::not_interested(peer_connection& c) void policy::not_interested(peer_connection& c)
{ {
// TODO: return the diff() of this peer to the if (m_torrent->ratio() != 0.f)
// pool of undistributed free upload {
assert(c.share_diff() < std::numeric_limits<int>::max());
int diff = c.share_diff();
if (diff > 0 && c.is_seed())
{
// the peer is a seed and has sent
// us more than we have sent it back.
// consider the download as free download
m_available_free_upload += diff;
c.add_free_upload(-diff);
}
}
} }
bool policy::unchoke_one_peer() bool policy::unchoke_one_peer()

View File

@ -44,6 +44,7 @@ POSSIBILITY OF SUCH DAMAGE.
#include <boost/filesystem/convenience.hpp> #include <boost/filesystem/convenience.hpp>
#include <boost/filesystem/exception.hpp> #include <boost/filesystem/exception.hpp>
#include <boost/limits.hpp> #include <boost/limits.hpp>
#include <boost/bind.hpp>
#include "libtorrent/peer_id.hpp" #include "libtorrent/peer_id.hpp"
#include "libtorrent/torrent_info.hpp" #include "libtorrent/torrent_info.hpp"
@ -935,6 +936,24 @@ namespace libtorrent
if (hash != real_hash) if (hash != real_hash)
return; return;
// the peers
entry::list_type& peer_list = rd.dict()["peers"].list();
std::vector<address> tmp_peers;
tmp_peers.reserve(peer_list.size());
for (entry::list_type::iterator i = peer_list.begin();
i != peer_list.end();
++i)
{
address a(i->dict()["ip"].string(), i->dict()["port"].integer());
tmp_peers.push_back(a);
}
peers.swap(tmp_peers);
// read piece map // read piece map
const entry::list_type& slots = rd.dict()["slots"].list(); const entry::list_type& slots = rd.dict()["slots"].list();
if (slots.size() > info.num_pieces()) if (slots.size() > info.num_pieces())
@ -990,21 +1009,19 @@ namespace libtorrent
tmp_unfinished.push_back(p); tmp_unfinished.push_back(p);
} }
// the peers // verify file sizes
entry::list_type& peer_list = rd.dict()["peers"].list(); std::vector<size_type> file_sizes;
entry::list_type& l = rd.dict()["file sizes"].list();
std::transform(
l.begin()
, l.end()
, std::back_inserter(file_sizes)
, boost::bind(&entry::integer, _1));
std::vector<address> tmp_peers; if (!match_filesizes(info, save_path, file_sizes))
tmp_peers.reserve(peer_list.size()); return;
for (entry::list_type::iterator i = peer_list.begin();
i != peer_list.end();
++i)
{
address a(i->dict()["ip"].string(), i->dict()["port"].integer());
tmp_peers.push_back(a);
}
peers.swap(tmp_peers);
piece_map.swap(tmp_pieces); piece_map.swap(tmp_pieces);
unfinished_pieces.swap(tmp_unfinished); unfinished_pieces.swap(tmp_unfinished);
} }

View File

@ -81,14 +81,6 @@ namespace {
} }
}; };
void print_bitmask(const std::vector<bool>& x)
{
for (std::size_t i = 0; i < x.size(); ++i)
{
std::cout << x[i];
}
}
} // namespace unnamed } // namespace unnamed
namespace fs = boost::filesystem; namespace fs = boost::filesystem;
@ -104,7 +96,43 @@ namespace {
} }
namespace libtorrent { namespace libtorrent
{
std::vector<size_type> get_filesizes(
const torrent_info& t
, const boost::filesystem::path& p)
{
std::vector<size_type> sizes;
for (torrent_info::file_iterator i = t.begin_files();
i != t.end_files();
++i)
{
file f(p / i->path / i->filename, file::in);
f.seek(0, file::end);
sizes.push_back(f.tell());
}
return sizes;
}
bool match_filesizes(
const torrent_info& t
, const boost::filesystem::path& p
, const std::vector<size_type>& sizes)
{
if (sizes.size() != t.num_files()) return false;
std::vector<size_type>::const_iterator s = sizes.begin();
for (torrent_info::file_iterator i = t.begin_files();
i != t.end_files();
++i, ++s)
{
file f(p / i->path / i->filename, file::in);
f.seek(0, file::end);
if (f.tell() != *s) return false;
}
return true;
}
struct thread_safe_storage struct thread_safe_storage
{ {
@ -394,10 +422,10 @@ namespace libtorrent {
// returns the slot currently associated with the given // returns the slot currently associated with the given
// piece or assigns the given piece_index to a free slot // piece or assigns the given piece_index to a free slot
int slot_for_piece(int piece_index); int slot_for_piece(int piece_index);
#ifndef NDEBUG
void check_invariant() const; void check_invariant() const;
void debug_log() const; void debug_log() const;
#endif
storage m_storage; storage m_storage;
// total number of bytes left to be downloaded // total number of bytes left to be downloaded
@ -464,9 +492,9 @@ namespace libtorrent {
// synchronization ------------------------------------------------------ // synchronization ------------------------------------------------------
boost::recursive_mutex::scoped_lock lock(m_mutex); boost::recursive_mutex::scoped_lock lock(m_mutex);
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------
#ifndef NDEBUG
check_invariant(); check_invariant();
#endif
p.clear(); p.clear();
std::vector<int>::const_reverse_iterator last; std::vector<int>::const_reverse_iterator last;
for (last = m_slot_to_piece.rbegin(); for (last = m_slot_to_piece.rbegin();
@ -484,8 +512,9 @@ namespace libtorrent {
p.push_back(*i); p.push_back(*i);
} }
#ifndef NDEBUG
check_invariant(); check_invariant();
#endif
} }
void piece_manager::export_piece_map( void piece_manager::export_piece_map(
@ -586,8 +615,10 @@ namespace libtorrent {
const std::size_t last_piece_size = m_info.piece_size( const std::size_t last_piece_size = m_info.piece_size(
m_info.num_pieces() - 1); m_info.num_pieces() - 1);
// if we have fast-resume info // if we have fast-resume info
// use it instead of doingthe actual checking // use it instead of doing the actual checking
if (!data.piece_map.empty() if (!data.piece_map.empty()
&& data.piece_map.size() <= m_slot_to_piece.size()) && data.piece_map.size() <= m_slot_to_piece.size())
{ {
@ -630,6 +661,9 @@ namespace libtorrent {
return; return;
} }
// do the real check (we didn't have valid resume data)
bool changed_file = true; bool changed_file = true;
// fs::ifstream in; // fs::ifstream in;
file in; file in;
@ -675,26 +709,6 @@ namespace libtorrent {
if (changed_file) if (changed_file)
{ {
/*
in.close();
in.clear();
in.open(path, std::ios_base::binary);
changed_file = false;
bytes_current_read = seek_into_next;
if (!in)
{
filesize = 0;
}
else
{
in.seekg(0, std::ios_base::end);
filesize = in.tellg();
in.seekg(seek_into_next, std::ios_base::beg);
}
*/
try try
{ {
changed_file = false; changed_file = false;
@ -709,7 +723,6 @@ namespace libtorrent {
{ {
filesize = 0; filesize = 0;
} }
} }
// we are at the start of a new piece // we are at the start of a new piece
@ -721,8 +734,6 @@ namespace libtorrent {
if (filesize > 0) if (filesize > 0)
{ {
// in.read(&piece_data[piece_offset], bytes_to_read);
// bytes_read = in.gcount();
bytes_read = in.read(&piece_data[piece_offset], bytes_to_read); bytes_read = in.read(&piece_data[piece_offset], bytes_to_read);
} }
@ -832,16 +843,28 @@ namespace libtorrent {
bytes_to_read = m_info.piece_size(current_slot); bytes_to_read = m_info.piece_size(current_slot);
} }
std::cout << " m_free_slots: " << m_free_slots.size() << "\n"; #ifndef NDEBUG
std::cout << " m_unallocated_slots: " << m_unallocated_slots.size() << "\n"; std::stringstream s;
std::cout << " num pieces: " << m_info.num_pieces() << "\n";
std::cout << " have_pieces: "; s << " m_free_slots: " << m_free_slots.size() << "\n"
print_bitmask(pieces); " m_unallocated_slots: " << m_unallocated_slots.size() << "\n"
std::cout << "\n"; " num pieces: " << m_info.num_pieces() << "\n"
std::cout << std::count(pieces.begin(), pieces.end(), true) << "\n"; " have_pieces:\n";
for (std::vector<bool>::iterator i = pieces.begin();
i != pieces.end();
++i)
{
if (((i - pieces.begin()) % 60) == 0) s << "\n";
if (*i) s << "1"; else s << "0";
}
s << "\n";
s << std::count(pieces.begin(), pieces.end(), true) << "\n";
data.torrent_ptr->debug_log(s.str());
#endif
#ifndef NDEBUG
check_invariant(); check_invariant();
#endif
} }
void piece_manager::check_pieces( void piece_manager::check_pieces(
@ -858,7 +881,9 @@ namespace libtorrent {
boost::recursive_mutex::scoped_lock lock(m_mutex); boost::recursive_mutex::scoped_lock lock(m_mutex);
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------
#ifndef NDEBUG
check_invariant(); check_invariant();
#endif
assert(piece_index >= 0 && piece_index < m_piece_to_slot.size()); assert(piece_index >= 0 && piece_index < m_piece_to_slot.size());
assert(m_piece_to_slot.size() == m_slot_to_piece.size()); assert(m_piece_to_slot.size() == m_slot_to_piece.size());
@ -870,7 +895,9 @@ namespace libtorrent {
assert(slot_index >= 0); assert(slot_index >= 0);
assert(slot_index < m_slot_to_piece.size()); assert(slot_index < m_slot_to_piece.size());
#ifndef NDEBUG
check_invariant(); check_invariant();
#endif
return slot_index; return slot_index;
} }
@ -918,6 +945,7 @@ namespace libtorrent {
if (slot_index != piece_index if (slot_index != piece_index
&& m_slot_to_piece[piece_index] >= 0) && m_slot_to_piece[piece_index] >= 0)
{ {
#ifndef NDEBUG
std::stringstream s; std::stringstream s;
s << "there is another piece at our slot, swapping.."; s << "there is another piece at our slot, swapping..";
@ -929,18 +957,13 @@ namespace libtorrent {
s << "\n piece at our slot: "; s << "\n piece at our slot: ";
s << m_slot_to_piece[piece_index]; s << m_slot_to_piece[piece_index];
s << "\n"; s << "\n";
#endif
int piece_at_our_slot = m_slot_to_piece[piece_index]; int piece_at_our_slot = m_slot_to_piece[piece_index];
assert(m_piece_to_slot[piece_at_our_slot] == piece_index); assert(m_piece_to_slot[piece_at_our_slot] == piece_index);
#ifndef NDEBUG
print_to_log(s.str()); print_to_log(s.str());
debug_log(); debug_log();
#endif
std::vector<char> buf(m_info.piece_length());
m_storage.read(&buf[0], piece_index, 0, m_info.piece_length());
m_storage.write(&buf[0], slot_index, 0, m_info.piece_length());
std::swap( std::swap(
m_slot_to_piece[piece_index] m_slot_to_piece[piece_index]
, m_slot_to_piece[slot_index]); , m_slot_to_piece[slot_index]);
@ -949,16 +972,22 @@ namespace libtorrent {
m_piece_to_slot[piece_index] m_piece_to_slot[piece_index]
, m_piece_to_slot[piece_at_our_slot]); , m_piece_to_slot[piece_at_our_slot]);
std::vector<char> buf(m_info.piece_length());
m_storage.read(&buf[0], piece_index, 0, m_info.piece_length());
m_storage.write(&buf[0], slot_index, 0, m_info.piece_length());
assert(m_slot_to_piece[piece_index] == piece_index); assert(m_slot_to_piece[piece_index] == piece_index);
assert(m_piece_to_slot[piece_index] == piece_index); assert(m_piece_to_slot[piece_index] == piece_index);
slot_index = piece_index; slot_index = piece_index;
#ifndef NDEBUG
debug_log(); debug_log();
#endif
} }
#ifndef NDEBUG
check_invariant(); check_invariant();
#endif
return slot_index; return slot_index;
} }
@ -977,7 +1006,9 @@ namespace libtorrent {
boost::recursive_mutex::scoped_lock lock(m_mutex); boost::recursive_mutex::scoped_lock lock(m_mutex);
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------
#ifndef NDEBUG
check_invariant(); check_invariant();
#endif
namespace fs = boost::filesystem; namespace fs = boost::filesystem;
@ -1019,7 +1050,9 @@ namespace libtorrent {
m_allocating = false; m_allocating = false;
#ifndef NDEBUG
check_invariant(); check_invariant();
#endif
} }
void piece_manager::allocate_slots(int num_slots) void piece_manager::allocate_slots(int num_slots)
@ -1031,7 +1064,8 @@ namespace libtorrent {
{ {
return m_pimpl->save_path(); return m_pimpl->save_path();
} }
#ifndef NDEBUG
void piece_manager::impl::check_invariant() const void piece_manager::impl::check_invariant() const
{ {
// synchronization ------------------------------------------------------ // synchronization ------------------------------------------------------
@ -1101,6 +1135,6 @@ namespace libtorrent {
print_to_log(s.str()); print_to_log(s.str());
} }
#endif
} // namespace libtorrent } // namespace libtorrent

View File

@ -426,11 +426,6 @@ namespace libtorrent
std::vector<address> downloaders; std::vector<address> downloaders;
m_picker.get_downloaders(downloaders, index); m_picker.get_downloaders(downloaders, index);
#ifndef NDEBUG
// std::cout << "hash-test failed. Some of these peers sent invalid data:\n";
// std::copy(downloaders.begin(), downloaders.end(), std::ostream_iterator<peer_id>(std::cout, "\n"));
#endif
// decrease the trust point of all peers that sent // decrease the trust point of all peers that sent
// parts of this piece. // parts of this piece.
for (std::vector<address>::iterator i = downloaders.begin(); for (std::vector<address>::iterator i = downloaders.begin();
@ -587,8 +582,6 @@ namespace libtorrent
peer_lost(*i); peer_lost(*i);
} }
// std::cout << p->get_socket()->sender().as_string() << " *** DISCONNECT\n";
m_policy->connection_closed(*p); m_policy->connection_closed(*p);
m_connections.erase(i); m_connections.erase(i);
@ -623,7 +616,6 @@ namespace libtorrent
m_ses.m_selector.monitor_readability(s); m_ses.m_selector.monitor_readability(s);
m_ses.m_selector.monitor_errors(s); m_ses.m_selector.monitor_errors(s);
// std::cout << "connecting to: " << a.as_string() << ":" << a.port() << "\n";
return *c; return *c;
} }
@ -792,6 +784,8 @@ namespace libtorrent
st.next_announce = next_announce() st.next_announce = next_announce()
- boost::posix_time::second_clock::local_time(); - boost::posix_time::second_clock::local_time();
st.announce_interval = boost::posix_time::seconds(m_duration);
st.num_peers = m_connections.size(); st.num_peers = m_connections.size();

View File

@ -252,6 +252,15 @@ namespace libtorrent
peer_list.push_back(peer); peer_list.push_back(peer);
} }
std::vector<size_type> file_sizes
= get_filesizes(t->torrent_file(), t->save_path());
ret.dict()["file sizes"] = entry::list_type();
std::copy(
file_sizes.begin()
, file_sizes.end()
, std::back_inserter(ret.dict()["file sizes"].list()));
return ret; return ret;
} }