optimized away torrent::m_have_pieces (#62) and added some documentation on bitfield. The piece picker is now constructed with the torrent, but still freed when turned into a seed

This commit is contained in:
Arvid Norberg
2008-06-07 02:58:28 +00:00
parent bcc24bf831
commit 9d1e77dc88
12 changed files with 394 additions and 276 deletions

View File

@@ -127,95 +127,96 @@
</ul>
</li>
<li><a class="reference" href="#big-number" id="id109" name="id109">big_number</a></li>
<li><a class="reference" href="#hasher" id="id110" name="id110">hasher</a></li>
<li><a class="reference" href="#fingerprint" id="id111" name="id111">fingerprint</a></li>
<li><a class="reference" href="#upnp-and-nat-pmp" id="id112" name="id112">UPnP and NAT-PMP</a><ul>
<li><a class="reference" href="#add-mapping" id="id113" name="id113">add_mapping</a></li>
<li><a class="reference" href="#delete-mapping" id="id114" name="id114">delete_mapping</a></li>
<li><a class="reference" href="#router-model" id="id115" name="id115">router_model()</a></li>
<li><a class="reference" href="#bitfield" id="id110" name="id110">bitfield</a></li>
<li><a class="reference" href="#hasher" id="id111" name="id111">hasher</a></li>
<li><a class="reference" href="#fingerprint" id="id112" name="id112">fingerprint</a></li>
<li><a class="reference" href="#upnp-and-nat-pmp" id="id113" name="id113">UPnP and NAT-PMP</a><ul>
<li><a class="reference" href="#add-mapping" id="id114" name="id114">add_mapping</a></li>
<li><a class="reference" href="#delete-mapping" id="id115" name="id115">delete_mapping</a></li>
<li><a class="reference" href="#router-model" id="id116" name="id116">router_model()</a></li>
</ul>
</li>
<li><a class="reference" href="#free-functions" id="id116" name="id116">free functions</a><ul>
<li><a class="reference" href="#identify-client" id="id117" name="id117">identify_client()</a></li>
<li><a class="reference" href="#client-fingerprint" id="id118" name="id118">client_fingerprint()</a></li>
<li><a class="reference" href="#bdecode-bencode" id="id119" name="id119">bdecode() bencode()</a></li>
<li><a class="reference" href="#free-functions" id="id117" name="id117">free functions</a><ul>
<li><a class="reference" href="#identify-client" id="id118" name="id118">identify_client()</a></li>
<li><a class="reference" href="#client-fingerprint" id="id119" name="id119">client_fingerprint()</a></li>
<li><a class="reference" href="#bdecode-bencode" id="id120" name="id120">bdecode() bencode()</a></li>
</ul>
</li>
<li><a class="reference" href="#alerts" id="id120" name="id120">alerts</a><ul>
<li><a class="reference" href="#external-ip-alert" id="id121" name="id121">external_ip_alert</a></li>
<li><a class="reference" href="#listen-failed-alert" id="id122" name="id122">listen_failed_alert</a></li>
<li><a class="reference" href="#portmap-error-alert" id="id123" name="id123">portmap_error_alert</a></li>
<li><a class="reference" href="#portmap-alert" id="id124" name="id124">portmap_alert</a></li>
<li><a class="reference" href="#file-error-alert" id="id125" name="id125">file_error_alert</a></li>
<li><a class="reference" href="#tracker-announce-alert" id="id126" name="id126">tracker_announce_alert</a></li>
<li><a class="reference" href="#tracker-alert" id="id127" name="id127">tracker_alert</a></li>
<li><a class="reference" href="#tracker-error-alert" id="id128" name="id128">tracker_error_alert</a></li>
<li><a class="reference" href="#tracker-reply-alert" id="id129" name="id129">tracker_reply_alert</a></li>
<li><a class="reference" href="#tracker-warning-alert" id="id130" name="id130">tracker_warning_alert</a></li>
<li><a class="reference" href="#scrape-reply-alert" id="id131" name="id131">scrape_reply_alert</a></li>
<li><a class="reference" href="#scrape-failed-alert" id="id132" name="id132">scrape_failed_alert</a></li>
<li><a class="reference" href="#url-seed-alert" id="id133" name="id133">url_seed_alert</a></li>
<li><a class="reference" href="#hash-failed-alert" id="id134" name="id134">hash_failed_alert</a></li>
<li><a class="reference" href="#peer-ban-alert" id="id135" name="id135">peer_ban_alert</a></li>
<li><a class="reference" href="#peer-error-alert" id="id136" name="id136">peer_error_alert</a></li>
<li><a class="reference" href="#invalid-request-alert" id="id137" name="id137">invalid_request_alert</a></li>
<li><a class="reference" href="#torrent-finished-alert" id="id138" name="id138">torrent_finished_alert</a></li>
<li><a class="reference" href="#metadata-failed-alert" id="id139" name="id139">metadata_failed_alert</a></li>
<li><a class="reference" href="#metadata-received-alert" id="id140" name="id140">metadata_received_alert</a></li>
<li><a class="reference" href="#fastresume-rejected-alert" id="id141" name="id141">fastresume_rejected_alert</a></li>
<li><a class="reference" href="#peer-blocked-alert" id="id142" name="id142">peer_blocked_alert</a></li>
<li><a class="reference" href="#storage-moved-alert" id="id143" name="id143">storage_moved_alert</a></li>
<li><a class="reference" href="#torrent-paused-alert" id="id144" name="id144">torrent_paused_alert</a></li>
<li><a class="reference" href="#save-resume-data-alert" id="id145" name="id145">save_resume_data_alert</a></li>
<li><a class="reference" href="#dispatcher" id="id146" name="id146">dispatcher</a></li>
<li><a class="reference" href="#alerts" id="id121" name="id121">alerts</a><ul>
<li><a class="reference" href="#external-ip-alert" id="id122" name="id122">external_ip_alert</a></li>
<li><a class="reference" href="#listen-failed-alert" id="id123" name="id123">listen_failed_alert</a></li>
<li><a class="reference" href="#portmap-error-alert" id="id124" name="id124">portmap_error_alert</a></li>
<li><a class="reference" href="#portmap-alert" id="id125" name="id125">portmap_alert</a></li>
<li><a class="reference" href="#file-error-alert" id="id126" name="id126">file_error_alert</a></li>
<li><a class="reference" href="#tracker-announce-alert" id="id127" name="id127">tracker_announce_alert</a></li>
<li><a class="reference" href="#tracker-alert" id="id128" name="id128">tracker_alert</a></li>
<li><a class="reference" href="#tracker-error-alert" id="id129" name="id129">tracker_error_alert</a></li>
<li><a class="reference" href="#tracker-reply-alert" id="id130" name="id130">tracker_reply_alert</a></li>
<li><a class="reference" href="#tracker-warning-alert" id="id131" name="id131">tracker_warning_alert</a></li>
<li><a class="reference" href="#scrape-reply-alert" id="id132" name="id132">scrape_reply_alert</a></li>
<li><a class="reference" href="#scrape-failed-alert" id="id133" name="id133">scrape_failed_alert</a></li>
<li><a class="reference" href="#url-seed-alert" id="id134" name="id134">url_seed_alert</a></li>
<li><a class="reference" href="#hash-failed-alert" id="id135" name="id135">hash_failed_alert</a></li>
<li><a class="reference" href="#peer-ban-alert" id="id136" name="id136">peer_ban_alert</a></li>
<li><a class="reference" href="#peer-error-alert" id="id137" name="id137">peer_error_alert</a></li>
<li><a class="reference" href="#invalid-request-alert" id="id138" name="id138">invalid_request_alert</a></li>
<li><a class="reference" href="#torrent-finished-alert" id="id139" name="id139">torrent_finished_alert</a></li>
<li><a class="reference" href="#metadata-failed-alert" id="id140" name="id140">metadata_failed_alert</a></li>
<li><a class="reference" href="#metadata-received-alert" id="id141" name="id141">metadata_received_alert</a></li>
<li><a class="reference" href="#fastresume-rejected-alert" id="id142" name="id142">fastresume_rejected_alert</a></li>
<li><a class="reference" href="#peer-blocked-alert" id="id143" name="id143">peer_blocked_alert</a></li>
<li><a class="reference" href="#storage-moved-alert" id="id144" name="id144">storage_moved_alert</a></li>
<li><a class="reference" href="#torrent-paused-alert" id="id145" name="id145">torrent_paused_alert</a></li>
<li><a class="reference" href="#save-resume-data-alert" id="id146" name="id146">save_resume_data_alert</a></li>
<li><a class="reference" href="#dispatcher" id="id147" name="id147">dispatcher</a></li>
</ul>
</li>
<li><a class="reference" href="#exceptions" id="id147" name="id147">exceptions</a><ul>
<li><a class="reference" href="#invalid-handle" id="id148" name="id148">invalid_handle</a></li>
<li><a class="reference" href="#duplicate-torrent" id="id149" name="id149">duplicate_torrent</a></li>
<li><a class="reference" href="#invalid-encoding" id="id150" name="id150">invalid_encoding</a></li>
<li><a class="reference" href="#type-error" id="id151" name="id151">type_error</a></li>
<li><a class="reference" href="#invalid-torrent-file" id="id152" name="id152">invalid_torrent_file</a></li>
<li><a class="reference" href="#exceptions" id="id148" name="id148">exceptions</a><ul>
<li><a class="reference" href="#invalid-handle" id="id149" name="id149">invalid_handle</a></li>
<li><a class="reference" href="#duplicate-torrent" id="id150" name="id150">duplicate_torrent</a></li>
<li><a class="reference" href="#invalid-encoding" id="id151" name="id151">invalid_encoding</a></li>
<li><a class="reference" href="#type-error" id="id152" name="id152">type_error</a></li>
<li><a class="reference" href="#invalid-torrent-file" id="id153" name="id153">invalid_torrent_file</a></li>
</ul>
</li>
<li><a class="reference" href="#storage-interface" id="id153" name="id153">storage_interface</a><ul>
<li><a class="reference" href="#initialize" id="id154" name="id154">initialize()</a></li>
<li><a class="reference" href="#read" id="id155" name="id155">read()</a></li>
<li><a class="reference" href="#write" id="id156" name="id156">write()</a></li>
<li><a class="reference" href="#id11" id="id157" name="id157">move_storage()</a></li>
<li><a class="reference" href="#verify-resume-data" id="id158" name="id158">verify_resume_data()</a></li>
<li><a class="reference" href="#write-resume-data" id="id159" name="id159">write_resume_data()</a></li>
<li><a class="reference" href="#move-slot" id="id160" name="id160">move_slot()</a></li>
<li><a class="reference" href="#swap-slots" id="id161" name="id161">swap_slots()</a></li>
<li><a class="reference" href="#swap-slots3" id="id162" name="id162">swap_slots3()</a></li>
<li><a class="reference" href="#hash-for-slot" id="id163" name="id163">hash_for_slot()</a></li>
<li><a class="reference" href="#release-files" id="id164" name="id164">release_files()</a></li>
<li><a class="reference" href="#delete-files" id="id165" name="id165">delete_files()</a></li>
<li><a class="reference" href="#storage-interface" id="id154" name="id154">storage_interface</a><ul>
<li><a class="reference" href="#initialize" id="id155" name="id155">initialize()</a></li>
<li><a class="reference" href="#read" id="id156" name="id156">read()</a></li>
<li><a class="reference" href="#write" id="id157" name="id157">write()</a></li>
<li><a class="reference" href="#id11" id="id158" name="id158">move_storage()</a></li>
<li><a class="reference" href="#verify-resume-data" id="id159" name="id159">verify_resume_data()</a></li>
<li><a class="reference" href="#write-resume-data" id="id160" name="id160">write_resume_data()</a></li>
<li><a class="reference" href="#move-slot" id="id161" name="id161">move_slot()</a></li>
<li><a class="reference" href="#swap-slots" id="id162" name="id162">swap_slots()</a></li>
<li><a class="reference" href="#swap-slots3" id="id163" name="id163">swap_slots3()</a></li>
<li><a class="reference" href="#hash-for-slot" id="id164" name="id164">hash_for_slot()</a></li>
<li><a class="reference" href="#release-files" id="id165" name="id165">release_files()</a></li>
<li><a class="reference" href="#delete-files" id="id166" name="id166">delete_files()</a></li>
</ul>
</li>
<li><a class="reference" href="#queuing" id="id166" name="id166">queuing</a><ul>
<li><a class="reference" href="#downloading" id="id167" name="id167">downloading</a></li>
<li><a class="reference" href="#seeding" id="id168" name="id168">seeding</a></li>
<li><a class="reference" href="#queuing" id="id167" name="id167">queuing</a><ul>
<li><a class="reference" href="#downloading" id="id168" name="id168">downloading</a></li>
<li><a class="reference" href="#seeding" id="id169" name="id169">seeding</a></li>
</ul>
</li>
<li><a class="reference" href="#fast-resume" id="id169" name="id169">fast resume</a><ul>
<li><a class="reference" href="#file-format" id="id170" name="id170">file format</a></li>
<li><a class="reference" href="#fast-resume" id="id170" name="id170">fast resume</a><ul>
<li><a class="reference" href="#file-format" id="id171" name="id171">file format</a></li>
</ul>
</li>
<li><a class="reference" href="#threads" id="id171" name="id171">threads</a></li>
<li><a class="reference" href="#storage-allocation" id="id172" name="id172">storage allocation</a><ul>
<li><a class="reference" href="#sparse-allocation" id="id173" name="id173">sparse allocation</a></li>
<li><a class="reference" href="#full-allocation" id="id174" name="id174">full allocation</a></li>
<li><a class="reference" href="#compact-allocation" id="id175" name="id175">compact allocation</a></li>
<li><a class="reference" href="#threads" id="id172" name="id172">threads</a></li>
<li><a class="reference" href="#storage-allocation" id="id173" name="id173">storage allocation</a><ul>
<li><a class="reference" href="#sparse-allocation" id="id174" name="id174">sparse allocation</a></li>
<li><a class="reference" href="#full-allocation" id="id175" name="id175">full allocation</a></li>
<li><a class="reference" href="#compact-allocation" id="id176" name="id176">compact allocation</a></li>
</ul>
</li>
<li><a class="reference" href="#extensions" id="id176" name="id176">extensions</a><ul>
<li><a class="reference" href="#metadata-from-peers" id="id177" name="id177">metadata from peers</a></li>
<li><a class="reference" href="#http-seeding" id="id178" name="id178">HTTP seeding</a></li>
<li><a class="reference" href="#extensions" id="id177" name="id177">extensions</a><ul>
<li><a class="reference" href="#metadata-from-peers" id="id178" name="id178">metadata from peers</a></li>
<li><a class="reference" href="#http-seeding" id="id179" name="id179">HTTP seeding</a></li>
</ul>
</li>
<li><a class="reference" href="#filename-checks" id="id179" name="id179">filename checks</a></li>
<li><a class="reference" href="#acknowledgments" id="id180" name="id180">acknowledgments</a></li>
<li><a class="reference" href="#filename-checks" id="id180" name="id180">filename checks</a></li>
<li><a class="reference" href="#acknowledgments" id="id181" name="id181">acknowledgments</a></li>
</ul>
</div>
<div class="section">
@@ -2236,7 +2237,7 @@ struct torrent_status
int connect_candidates;
const std::vector&lt;bool&gt;* pieces;
bitfield pieces;
int num_pieces;
size_type total_done;
@@ -2482,7 +2483,7 @@ struct peer_info
size_type total_download;
size_type total_upload;
peer_id pid;
std::vector&lt;bool&gt; pieces;
bitfield pieces;
int upload_limit;
int download_limit;
@@ -2686,9 +2687,9 @@ the payload data.</p>
<p><tt class="docutils literal"><span class="pre">pid</span></tt> is the peer's id as used in the bit torrent protocol. This id can be used to
extract 'fingerprints' from the peer. Sometimes it can tell you which client the peer
is using. See identify_client()_</p>
<p><tt class="docutils literal"><span class="pre">pieces</span></tt> is a vector of booleans that has as many entries as there are pieces
in the torrent. Each boolean tells you if the peer has that piece (if it's set to true)
or if the peer miss that piece (set to false).</p>
<p><tt class="docutils literal"><span class="pre">pieces</span></tt> is a bitfield, with one bit per piece in the torrent.
Each bit tells you if the peer has that piece (if it's set to 1)
or if the peer miss that piece (set to 0).</p>
<p><tt class="docutils literal"><span class="pre">seed</span></tt> is true if this peer is a seed.</p>
<p><tt class="docutils literal"><span class="pre">upload_limit</span></tt> is the number of bytes per second we are allowed to send to this
peer every second. It may be -1 if there's no local limit on the peer. The global
@@ -3235,6 +3236,50 @@ public:
<p>The iterators gives you access to individual bytes.</p>
</div>
<div class="section">
<h1><a id="bitfield" name="bitfield">bitfield</a></h1>
<p>The bitfiled type stores any number of bits as a bitfield in an array.</p>
<pre class="literal-block">
class bitfield
{
bitfield();
bitfield(int bits);
bitfield(int bits, bool val);
bitfield(char const* bytes, int bits);
bitfield(bitfield const&amp; rhs);
void borrow_bytes(char* bytes, int bits);
~bitfield();
void assign(char const* bytes, int bits);
bool operator[](int index) const;
bool get_bit(int index) const;
void clear_bit(int index);
void set_bit(int index);
std::size_t size() const;
bool empty() const;
char const* bytes() const;
bitfield&amp; operator=(bitfield const&amp; rhs);
int count() const;
typedef const_iterator;
const_iterator begin() const;
const_iterator end() const;
void resize(int bits, bool val);
void set_all();
void clear_all();
void resize(int bits);
};
</pre>
</div>
<div class="section">
<h1><a id="hasher" name="hasher">hasher</a></h1>
<p>This class creates sha1-hashes. Its declaration looks like this:</p>
<pre class="literal-block">