<tablewidth="100%"border="1"style="border-collapse: collapse;"><trstyle="background: #f44"><td>relevance 4</td><td><ahref="javascript:expand(0)">../src/http_tracker_connection.cpp:479</a></td><td>this is a bug. if the info-hash contains a 0, this will fail!</td></tr><trid="0"style="display: none;"colspan="3"><tdcolspan="3"><h2>this is a bug. if the info-hash contains a 0, this will
fail!</h2><h4>../src/http_tracker_connection.cpp:479</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> if (failure)
if (peers_ent && peers_ent->type() == lazy_entry::string_t)
{
char const* peers = peers_ent->string_ptr();
int len = peers_ent->string_length();
resp.peers4.reserve(len / 6);
for (int i = 0; i < len; i += 6)
{
if (len - i < 6) break;
</pre></td></tr><trstyle="background: #f44"><td>relevance 4</td><td><ahref="javascript:expand(1)">../src/session_impl.cpp:479</a></td><td>in order to support SSL over uTP, the utp_socket manager either needs to be able to receive packets on multiple ports, or we need to peek into the first few bytes the payload stream of a socket to determine whether or not it's an SSL connection. (The former is simpler but won't do as well with NATs)</td></tr><trid="1"style="display: none;"colspan="3"><tdcolspan="3"><h2>in order to support SSL over uTP, the utp_socket manager either
do as well with NATs)</h2><h4>../src/session_impl.cpp:479</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> , m_optimistic_unchoke_time_scaler(0)
</pre></td></tr><trstyle="background: #f44"><td>relevance 4</td><td><ahref="javascript:expand(2)">../src/torrent.cpp:9647</a></td><td>this logic doesn't work for seeding torrents that are not ticked</td></tr><trid="2"style="display: none;"colspan="3"><tdcolspan="3"><h2>this logic doesn't work for seeding torrents that are not ticked</h2><h4>../src/torrent.cpp:9647</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> {
</pre></td></tr><trstyle="background: #f44"><td>relevance 4</td><td><ahref="javascript:expand(3)">../src/kademlia/refresh.cpp:93</a></td><td>when bootstrapping against our own IP completes, continue to issue another bootstrap against the deepest, non-full bucket. when it completes, issue a bootstrap against one bucket above it, and so on until the bootstrap lookup against the top level bucket (bucket 0) completes. That's when the bootstrap is done</td></tr><trid="3"style="display: none;"colspan="3"><tdcolspan="3"><h2>when bootstrapping against our own IP completes,
ret = dht::verify_message(&response, pong_desc, parsed, 4, error_string, sizeof(error_string));
</pre></td></tr><trstyle="background: #fcc"><td>relevance 3</td><td><ahref="javascript:expand(5)">../test/test_transfer.cpp:284</a></td><td>factor out the disk-full test into its own unit test</td></tr><trid="5"style="display: none;"colspan="3"><tdcolspan="3"><h2>factor out the disk-full test into its own unit test</h2><h4>../test/test_transfer.cpp:284</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> print_alerts(ses1, "ses1", true, true, true, &on_alert);
fprintf(stderr, "%s: discovered disk full mode. Raise limit and disable upload-mode\n", time_now_string());
peer_disconnects = 0;
continue;
</pre></td></tr><trstyle="background: #fcc"><td>relevance 3</td><td><ahref="javascript:expand(6)">../src/disk_io_thread.cpp:242</a></td><td>it would be nice to have the number of threads be set dynamically</td></tr><trid="6"style="display: none;"colspan="3"><tdcolspan="3"><h2>it would be nice to have the number of threads be set dynamically</h2><h4>../src/disk_io_thread.cpp:242</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> std::pair<block_cache::iterator, block_cache::iterator> pieces
</pre></td></tr><trstyle="background: #fcc"><td>relevance 3</td><td><ahref="javascript:expand(7)">../src/peer_connection.cpp:1796</a></td><td>we should probably use ses.m_allowed_upload_slots here instead to work with auto-unchoke logic</td></tr><trid="7"style="display: none;"colspan="3"><tdcolspan="3"><h2>we should probably use ses.m_allowed_upload_slots here instead
to work with auto-unchoke logic</h2><h4>../src/peer_connection.cpp:1796</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;">#endif
</pre></td></tr><trstyle="background: #fcc"><td>relevance 3</td><td><ahref="javascript:expand(8)">../src/peer_connection.cpp:3133</a></td><td>since we throw away the queue entry once we issue the disk job, this may happen. Instead, we should keep the queue entry around, mark it as having been requested from disk and once the disk job comes back, discard it if it has been cancelled. Maybe even be able to cancel disk jobs?</td></tr><trid="8"style="display: none;"colspan="3"><tdcolspan="3"><h2>since we throw away the queue entry once we issue
been cancelled. Maybe even be able to cancel disk jobs?</h2><h4>../src/peer_connection.cpp:3133</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;">
</pre></td></tr><trstyle="background: #fcc"><td>relevance 3</td><td><ahref="javascript:expand(9)">../src/peer_connection.cpp:4867</a></td><td>instead of using settings_pack::request_timeout, use m_rtt.mean() + m_rtt.avg_deviation() * 2 or something like that. the configuration option could hopefully be removed</td></tr><trid="9"style="display: none;"colspan="3"><tdcolspan="3"><h2>instead of using settings_pack::request_timeout, use
the configuration option could hopefully be removed</h2><h4>../src/peer_connection.cpp:4867</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> // don't bother disconnect peers we haven't been interested
</pre></td></tr><trstyle="background: #fcc"><td>relevance 3</td><td><ahref="javascript:expand(10)">../src/piece_picker.cpp:3166</a></td><td>it would be nice if this could be folded into lock_piece() the main distinction is that this also maintains the m_num_passed counter and the passed_hash_check member</td></tr><trid="10"style="display: none;"colspan="3"><tdcolspan="3"><h2>it would be nice if this could be folded into lock_piece()
the main distinction is that this also maintains the m_num_passed
counter and the passed_hash_check member</h2><h4>../src/piece_picker.cpp:3166</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> int state = m_piece_map[piece].state;
if (state == piece_pos::piece_open) return;
std::vector<downloading_piece>::iterator i = find_dl_piece(state - 1, piece);
if (i == m_downloads[state - 1].end()) return;
TORRENT_ASSERT(i->passed_hash_check == false);
if (i->passed_hash_check)
{
// it's not clear why this would happen,
// but it seems reasonable to not break the
// accounting over it.
i->passed_hash_check = false;
TORRENT_ASSERT(m_num_passed > 0);
--m_num_passed;
}
// prevent this piece from being picked until it's restored
</pre></td></tr><trstyle="background: #fcc"><td>relevance 3</td><td><ahref="javascript:expand(11)">../src/resolver.cpp:39</a></td><td>the first places to use this resolver is the http_connection/http_tracker_connection and udp_tracker_connection. make sure to prefer cache on shutdown</td></tr><trid="11"style="display: none;"colspan="3"><tdcolspan="3"><h2>the first places to use this resolver is the
http_connection/http_tracker_connection and udp_tracker_connection.
make sure to prefer cache on shutdown</h2><h4>../src/resolver.cpp:39</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;">THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
</pre></td></tr><trstyle="background: #fcc"><td>relevance 3</td><td><ahref="javascript:expand(12)">../src/session_impl.cpp:5535</a></td><td>it would be really nice to update these counters as they are incremented. This depends on the session being ticked, which has a fairly coarse grained resolution</td></tr><trid="12"style="display: none;"colspan="3"><tdcolspan="3"><h2>it would be really nice to update these counters
being ticked, which has a fairly coarse grained resolution</h2><h4>../src/session_impl.cpp:5535</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> t->status(&alert->status.back(), ~torrent_handle::query_accurate_download_counters);
</pre></td></tr><trstyle="background: #fcc"><td>relevance 3</td><td><ahref="javascript:expand(13)">../src/session_impl.cpp:7002</a></td><td>If socket jobs could be higher level, to include RC4 encryption and decryption, we would offload the main thread even more</td></tr><trid="13"style="display: none;"colspan="3"><tdcolspan="3"><h2>If socket jobs could be higher level, to include RC4 encryption and decryption,
we would offload the main thread even more</h2><h4>../src/session_impl.cpp:7002</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> {
</pre></td></tr><trstyle="background: #fcc"><td>relevance 3</td><td><ahref="javascript:expand(14)">../src/torrent.cpp:1084</a></td><td>if any other peer has a busy request to this block, we need to cancel it too</td></tr><trid="14"style="display: none;"colspan="3"><tdcolspan="3"><h2>if any other peer has a busy request to this block, we need to cancel it too</h2><h4>../src/torrent.cpp:1084</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;">#endif
</pre></td></tr><trstyle="background: #fcc"><td>relevance 3</td><td><ahref="javascript:expand(15)">../src/torrent.cpp:7686</a></td><td>if peer is a really good peer, maybe we shouldn't disconnect it</td></tr><trid="15"style="display: none;"colspan="3"><tdcolspan="3"><h2>if peer is a really good peer, maybe we shouldn't disconnect it</h2><h4>../src/torrent.cpp:7686</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;">#if defined TORRENT_LOGGING || defined TORRENT_ERROR_LOGGING
</pre></td></tr><trstyle="background: #fcc"><td>relevance 3</td><td><ahref="javascript:expand(16)">../src/web_peer_connection.cpp:596</a></td><td>just make this peer not have the pieces associated with the file we just requested. Only when it doesn't have any of the file do the following</td></tr><trid="16"style="display: none;"colspan="3"><tdcolspan="3"><h2>just make this peer not have the pieces
when it doesn't have any of the file do the following</h2><h4>../src/web_peer_connection.cpp:596</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> {
</pre></td></tr><trstyle="background: #fcc"><td>relevance 3</td><td><ahref="javascript:expand(17)">../include/libtorrent/block_cache.hpp:209</a></td><td>could this be a scoped_array instead? does cached_piece_entry really need to be copyable? cached_piece_entry does need to be copyable since it's part of a container, but it's possible it could be a raw pointer or boost::unique_ptr perhaps</td></tr><trid="17"style="display: none;"colspan="3"><tdcolspan="3"><h2>could this be a scoped_array instead? does cached_piece_entry
really need to be copyable? cached_piece_entry does need to be
copyable since it's part of a container, but it's possible it could be
a raw pointer or boost::unique_ptr perhaps</h2><h4>../include/libtorrent/block_cache.hpp:209</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> tailqueue read_jobs;
</pre></td></tr><trstyle="background: #fcc"><td>relevance 3</td><td><ahref="javascript:expand(18)">../include/libtorrent/disk_io_thread.hpp:537</a></td><td>turn these counters and gauges into session_stats counters (which also would need to be thread safe)</td></tr><trid="18"style="display: none;"colspan="3"><tdcolspan="3"><h2>turn these counters and gauges into session_stats
counters (which also would need to be thread safe)</h2><h4>../include/libtorrent/disk_io_thread.hpp:537</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> void* m_userdata;
// the last time we expired write blocks from the cache
</pre></td></tr><trstyle="background: #fcc"><td>relevance 3</td><td><ahref="javascript:expand(19)">../include/libtorrent/policy.hpp:104</a></td><td>this class should be renamed peer_list</td></tr><trid="19"style="display: none;"colspan="3"><tdcolspan="3"><h2>this class should be renamed peer_list</h2><h4>../include/libtorrent/policy.hpp:104</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> int min_reconnect_time;
</pre></td></tr><trstyle="background: #fcc"><td>relevance 3</td><td><ahref="javascript:expand(20)">../include/libtorrent/session.hpp:210</a></td><td>could the fingerprint be a setting as well? And should the settings_pack be optional?</td></tr><trid="20"style="display: none;"colspan="3"><tdcolspan="3"><h2>could the fingerprint be a setting as well? And should the
</pre></td></tr><trstyle="background: #fcc"><td>relevance 3</td><td><ahref="javascript:expand(21)">../include/libtorrent/torrent_info.hpp:221</a></td><td>this type should be different from the one used by torrent. It should not include internal state.</td></tr><trid="21"style="display: none;"colspan="3"><tdcolspan="3"><h2>this type should be different from the one used by torrent. It
should not include internal state.</h2><h4>../include/libtorrent/torrent_info.hpp:221</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;">&& !updating;
}
#endif
// returns true if we can announec to this tracker now.
// The current time is passed in as ``now``. The ``is_seed``
// argument is necessary because once we become a seed, we
// need to announce right away, even if the re-announce timer
// hasn't expired yet.
bool can_announce(ptime now, bool is_seed) const;
// returns true if the last time we tried to announce to this
// tracker succeeded, or if we haven't tried yet.
bool is_working() const
{ return fails == 0; }
// trims whitespace characters from the beginning of the URL.
void trim();
};
<divstyle="background: #ffff00"width="100%">
</div> // the web_seed_entry holds information about a web seed (also known
// as URL seed or HTTP seed). It is essentially a URL with some state
// associated with it. For more information, see `BEP 17`_ and `BEP 19`_.
struct web_seed_entry
{
// http seeds are different from url seeds in the
// protocol they use. http seeds follows the original
</pre></td></tr><trstyle="background: #cfc"><td>relevance 2</td><td><ahref="javascript:expand(22)">../src/disk_io_thread.cpp:844</a></td><td>should this be allocated on the stack?</td></tr><trid="22"style="display: none;"colspan="3"><tdcolspan="3"><h2>should this be allocated on the stack?</h2><h4>../src/disk_io_thread.cpp:844</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> // if we're also flushing the read cache, this piece
</pre></td></tr><trstyle="background: #cfc"><td>relevance 2</td><td><ahref="javascript:expand(23)">../src/disk_io_thread.cpp:885</a></td><td>we're not flushing the read cache at all?</td></tr><trid="23"style="display: none;"colspan="3"><tdcolspan="3"><h2>we're not flushing the read cache at all?</h2><h4>../src/disk_io_thread.cpp:885</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> // from disk_io_thread::do_delete, which is a fence job and should
</pre></td></tr><trstyle="background: #cfc"><td>relevance 2</td><td><ahref="javascript:expand(24)">../src/file.cpp:1491</a></td><td>use vm_copy here, if available, and if buffers are aligned</td></tr><trid="24"style="display: none;"colspan="3"><tdcolspan="3"><h2>use vm_copy here, if available, and if buffers are aligned</h2><h4>../src/file.cpp:1491</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> CloseHandle(native_handle());
</pre></td></tr><trstyle="background: #cfc"><td>relevance 2</td><td><ahref="javascript:expand(25)">../src/file.cpp:1502</a></td><td>use vm_copy here, if available, and if buffers are aligned</td></tr><trid="25"style="display: none;"colspan="3"><tdcolspan="3"><h2>use vm_copy here, if available, and if buffers are aligned</h2><h4>../src/file.cpp:1502</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> }
</pre></td></tr><trstyle="background: #cfc"><td>relevance 2</td><td><ahref="javascript:expand(27)">../src/session_impl.cpp:4435</a></td><td>make a list for torrents that want to be announced on the DHT so we don't have to loop over all torrents, just to find the ones that want to announce</td></tr><trid="27"style="display: none;"colspan="3"><tdcolspan="3"><h2>make a list for torrents that want to be announced on the DHT so we
don't have to loop over all torrents, just to find the ones that want to announce</h2><h4>../src/session_impl.cpp:4435</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> if (!m_dht_torrents.empty())
</pre></td></tr><trstyle="background: #cfc"><td>relevance 2</td><td><ahref="javascript:expand(29)">../src/torrent.cpp:4693</a></td><td>abort lookups this torrent has made via the session host resolver interface</td></tr><trid="29"style="display: none;"colspan="3"><tdcolspan="3"><h2>abort lookups this torrent has made via the
session host resolver interface</h2><h4>../src/torrent.cpp:4693</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> // files belonging to the torrents
</pre></td></tr><trstyle="background: #cfc"><td>relevance 2</td><td><ahref="javascript:expand(30)">../src/udp_tracker_connection.cpp:64</a></td><td>it would be nice to not have a dependency on session_impl here</td></tr><trid="30"style="display: none;"colspan="3"><tdcolspan="3"><h2>it would be nice to not have a dependency on session_impl here</h2><h4>../src/udp_tracker_connection.cpp:64</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;">#pragma warning(pop)
</pre></td></tr><trstyle="background: #cfc"><td>relevance 2</td><td><ahref="javascript:expand(31)">../src/web_peer_connection.cpp:655</a></td><td>create a mapping of file-index to redirection URLs. Use that to form URLs instead. Support to reconnect to a new server without destructing this peer_connection</td></tr><trid="31"style="display: none;"colspan="3"><tdcolspan="3"><h2>create a mapping of file-index to redirection URLs. Use that to form
</pre></td></tr><trstyle="background: #cfc"><td>relevance 2</td><td><ahref="javascript:expand(33)">../src/kademlia/node.cpp:67</a></td><td>make this configurable in dht_settings</td></tr><trid="33"style="display: none;"colspan="3"><tdcolspan="3"><h2>make this configurable in dht_settings</h2><h4>../src/kademlia/node.cpp:67</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;">#include "libtorrent/kademlia/routing_table.hpp"
</pre></td></tr><trstyle="background: #cfc"><td>relevance 2</td><td><ahref="javascript:expand(34)">../src/kademlia/node_id.cpp:133</a></td><td>this could be optimized if SSE 4.2 is available. It could also be optimized given that we have a fixed length</td></tr><trid="34"style="display: none;"colspan="3"><tdcolspan="3"><h2>this could be optimized if SSE 4.2 is
that we have a fixed length</h2><h4>../src/kademlia/node_id.cpp:133</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> b6 = ip_.to_v6().to_bytes();
</pre></td></tr><trstyle="background: #cfc"><td>relevance 2</td><td><ahref="javascript:expand(35)">../include/libtorrent/enum_net.hpp:137</a></td><td>this could be done more efficiently by just looking up the interface with the given name, maybe even with if_nametoindex()</td></tr><trid="35"style="display: none;"colspan="3"><tdcolspan="3"><h2>this could be done more efficiently by just looking up
the interface with the given name, maybe even with if_nametoindex()</h2><h4>../include/libtorrent/enum_net.hpp:137</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;">
address ip = address::from_string(device_name, ec);
if (!ec)
{
bind_ep.address(ip);
// it appears to be an IP. Just bind to that address
sock.bind(bind_ep, ec);
return bind_ep.address();
}
ec.clear();
#ifdef SO_BINDTODEVICE
// try to use SO_BINDTODEVICE here, if that exists. If it fails,
</pre></td></tr><trstyle="background: #cfc"><td>relevance 2</td><td><ahref="javascript:expand(36)">../include/libtorrent/intrusive_ptr_base.hpp:44</a></td><td>remove this class and transition over to using shared_ptr and make_shared instead</td></tr><trid="36"style="display: none;"colspan="3"><tdcolspan="3"><h2>remove this class and transition over to using shared_ptr and
make_shared instead</h2><h4>../include/libtorrent/intrusive_ptr_base.hpp:44</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;">CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
</pre></td></tr><trstyle="background: #cfc"><td>relevance 2</td><td><ahref="javascript:expand(37)">../include/libtorrent/settings_pack.hpp:70</a></td><td>add an API to query a settings_pack as well</td></tr><trid="37"style="display: none;"colspan="3"><tdcolspan="3"><h2>add an API to query a settings_pack as well</h2><h4>../include/libtorrent/settings_pack.hpp:70</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"></pre></td></tr><trstyle="background: #cfc"><td>relevance 2</td><td><ahref="javascript:expand(38)">../include/libtorrent/settings_pack.hpp:71</a></td><td>maybe convert all bool types into int-types as well</td></tr><trid="38"style="display: none;"colspan="3"><tdcolspan="3"><h2>maybe convert all bool types into int-types as well</h2><h4>../include/libtorrent/settings_pack.hpp:71</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;">{
</pre></td></tr><trstyle="background: #cfc"><td>relevance 2</td><td><ahref="javascript:expand(39)">../include/libtorrent/socks5_stream.hpp:129</a></td><td>fix error messages to use custom error_code category</td></tr><trid="39"style="display: none;"colspan="3"><tdcolspan="3"><h2>fix error messages to use custom error_code category</h2><h4>../include/libtorrent/socks5_stream.hpp:129</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"></pre></td></tr><trstyle="background: #cfc"><td>relevance 2</td><td><ahref="javascript:expand(40)">../include/libtorrent/socks5_stream.hpp:130</a></td><td>add async_connect() that takes a hostname and port as well</td></tr><trid="40"style="display: none;"colspan="3"><tdcolspan="3"><h2>add async_connect() that takes a hostname and port as well</h2><h4>../include/libtorrent/socks5_stream.hpp:130</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> if (m_dst_name.size() > 255)
</pre></td></tr><trstyle="background: #cfc"><td>relevance 2</td><td><ahref="javascript:expand(41)">../include/libtorrent/torrent.hpp:1195</a></td><td>replace all usage of this with m_ses.get_resolver()</td></tr><trid="41"style="display: none;"colspan="3"><tdcolspan="3"><h2>replace all usage of this with m_ses.get_resolver()</h2><h4>../include/libtorrent/torrent.hpp:1195</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;">
</pre></td></tr><trstyle="background: #cfc"><td>relevance 2</td><td><ahref="javascript:expand(42)">../include/libtorrent/torrent_info.hpp:306</a></td><td>there may be some opportunities to optimize the size if torrent_info. specifically to turn some std::string and std::vector into pointers</td></tr><trid="42"style="display: none;"colspan="3"><tdcolspan="3"><h2>there may be some opportunities to optimize the size if torrent_info.
specifically to turn some std::string and std::vector into pointers</h2><h4>../include/libtorrent/torrent_info.hpp:306</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> bool resolving;
</pre></td></tr><trstyle="background: #cfc"><td>relevance 2</td><td><ahref="javascript:expand(43)">../include/libtorrent/aux_/session_interface.hpp:108</a></td><td>the IP voting mechanism should be factored out to its own class, not part of the session</td></tr><trid="43"style="display: none;"colspan="3"><tdcolspan="3"><h2>the IP voting mechanism should be factored out
to its own class, not part of the session</h2><h4>../include/libtorrent/aux_/session_interface.hpp:108</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> class port_filter;
struct settings_pack;
struct torrent_peer_allocator_interface;
struct counters;
struct resolver_interface;
#ifndef TORRENT_DISABLE_DHT
namespace dht
{
struct dht_tracker;
}
#endif
}
namespace libtorrent { namespace aux
{
// TOOD: make this interface a lot smaller
struct session_interface
: buffer_allocator_interface
{
<divstyle="background: #ffff00"width="100%"> enum
</div> {
source_dht = 1,
source_peer = 2,
source_tracker = 4,
source_router = 8
};
virtual void set_external_address(address const& ip
, int source_type, address const& source) = 0;
</pre></td></tr><trstyle="background: #ccf"><td>relevance 1</td><td><ahref="javascript:expand(44)">../src/http_seed_connection.cpp:124</a></td><td>in chunked encoding mode, this assert won't hold. the chunk headers should be subtracted from the receive_buffer_size</td></tr><trid="44"style="display: none;"colspan="3"><tdcolspan="3"><h2>in chunked encoding mode, this assert won't hold.
the chunk headers should be subtracted from the receive_buffer_size</h2><h4>../src/http_seed_connection.cpp:124</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> boost::optional<piece_block_progress>
</pre></td></tr><trstyle="background: #ccf"><td>relevance 1</td><td><ahref="javascript:expand(45)">../src/session_impl.cpp:6353</a></td><td>report the proper address of the router as the source IP of this understanding of our external address, instead of the empty address</td></tr><trid="45"style="display: none;"colspan="3"><tdcolspan="3"><h2>report the proper address of the router as the source IP of
this understanding of our external address, instead of the empty address</h2><h4>../src/session_impl.cpp:6353</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> void session_impl::on_port_mapping(int mapping, address const& ip, int port
</pre></td></tr><trstyle="background: #ccf"><td>relevance 1</td><td><ahref="javascript:expand(46)">../src/session_impl.cpp:7514</a></td><td>we only need to do this if our global IPv4 address has changed since the DHT (currently) only supports IPv4. Since restarting the DHT is kind of expensive, it would be nice to not do it unnecessarily</td></tr><trid="46"style="display: none;"colspan="3"><tdcolspan="3"><h2>we only need to do this if our global IPv4 address has changed
is kind of expensive, it would be nice to not do it unnecessarily</h2><h4>../src/session_impl.cpp:7514</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;">#endif
</pre></td></tr><trstyle="background: #ccf"><td>relevance 1</td><td><ahref="javascript:expand(47)">../src/torrent.cpp:1143</a></td><td>make this depend on the error and on the filesystem the files are being downloaded to. If the error is no_space_left_on_device and the filesystem doesn't support sparse files, only zero the priorities of the pieces that are at the tails of all files, leaving everything up to the highest written piece in each file</td></tr><trid="47"style="display: none;"colspan="3"><tdcolspan="3"><h2>make this depend on the error and on the filesystem the
up to the highest written piece in each file</h2><h4>../src/torrent.cpp:1143</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> alerts().post_alert(file_error_alert(j->error.ec
</pre></td></tr><trstyle="background: #ccf"><td>relevance 1</td><td><ahref="javascript:expand(48)">../src/torrent.cpp:6845</a></td><td>save the send_stats state instead of throwing them away it may pose an issue when downgrading though</td></tr><trid="48"style="display: none;"colspan="3"><tdcolspan="3"><h2>save the send_stats state instead of throwing them away
it may pose an issue when downgrading though</h2><h4>../src/torrent.cpp:6845</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> for (int k = 0; k < bits; ++k)
</pre></td></tr><trstyle="background: #ccf"><td>relevance 1</td><td><ahref="javascript:expand(49)">../src/torrent.cpp:7934</a></td><td>should disconnect all peers that have the pieces we have not just seeds. It would be pretty expensive to check all pieces for all peers though</td></tr><trid="49"style="display: none;"colspan="3"><tdcolspan="3"><h2>should disconnect all peers that have the pieces we have
for all peers though</h2><h4>../src/torrent.cpp:7934</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> set_state(torrent_status::finished);
</pre></td></tr><trstyle="background: #ccf"><td>relevance 1</td><td><ahref="javascript:expand(50)">../src/kademlia/node.cpp:835</a></td><td>find_node should write directly to the response entry</td></tr><trid="50"style="display: none;"colspan="3"><tdcolspan="3"><h2>find_node should write directly to the response entry</h2><h4>../src/kademlia/node.cpp:835</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> TORRENT_LOG(node) << " values: " << reply["values"].list().size();
</pre></td></tr><trstyle="background: #ccf"><td>relevance 1</td><td><ahref="javascript:expand(51)">../include/libtorrent/ip_voter.hpp:122</a></td><td>instead, have one instance per possible subnet, global IPv4, global IPv6, loopback, 192.168.x.x, 10.x.x.x, etc.</td></tr><trid="51"style="display: none;"colspan="3"><tdcolspan="3"><h2>instead, have one instance per possible subnet, global IPv4, global IPv6, loopback, 192.168.x.x, 10.x.x.x, etc.</h2><h4>../include/libtorrent/ip_voter.hpp:122</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> // away all the votes and started from scratch, in case
</pre></td></tr><trstyle="background: #ccf"><td>relevance 1</td><td><ahref="javascript:expand(52)">../include/libtorrent/web_peer_connection.hpp:121</a></td><td>if we make this be a disk_buffer_holder instead we would save a copy sometimes use allocate_disk_receive_buffer and release_disk_receive_buffer</td></tr><trid="52"style="display: none;"colspan="3"><tdcolspan="3"><h2>if we make this be a disk_buffer_holder instead
use allocate_disk_receive_buffer and release_disk_receive_buffer</h2><h4>../include/libtorrent/web_peer_connection.hpp:121</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;">
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(59)">../test/test_metadata_extension.cpp:73</a></td><td>it would be nice to test reversing which session is making the connection as well</td></tr><trid="59"style="display: none;"colspan="3"><tdcolspan="3"><h2>it would be nice to test reversing
which session is making the connection as well</h2><h4>../test/test_metadata_extension.cpp:73</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;">
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(60)">../test/test_policy.cpp:419</a></td><td>test applying a port_filter</td></tr><trid="60"style="display: none;"colspan="3"><tdcolspan="3"><h2>test applying a port_filter</h2><h4>../test/test_policy.cpp:419</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"></pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(61)">../test/test_policy.cpp:420</a></td><td>test erasing peers</td></tr><trid="61"style="display: none;"colspan="3"><tdcolspan="3"><h2>test erasing peers</h2><h4>../test/test_policy.cpp:420</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"></pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(62)">../test/test_policy.cpp:421</a></td><td>test using port and ip filter</td></tr><trid="62"style="display: none;"colspan="3"><tdcolspan="3"><h2>test using port and ip filter</h2><h4>../test/test_policy.cpp:421</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"></pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(63)">../test/test_policy.cpp:422</a></td><td>test incrementing failcount (and make sure we no longer consider the peer a connect canidate)</td></tr><trid="63"style="display: none;"colspan="3"><tdcolspan="3"><h2>test incrementing failcount (and make sure we no longer consider the peer a connect canidate)</h2><h4>../test/test_policy.cpp:422</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"></pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(64)">../test/test_policy.cpp:423</a></td><td>test max peerlist size</td></tr><trid="64"style="display: none;"colspan="3"><tdcolspan="3"><h2>test max peerlist size</h2><h4>../test/test_policy.cpp:423</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"></pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(65)">../test/test_policy.cpp:424</a></td><td>test logic for which connection to keep when receiving an incoming connection to the same peer as we just made an outgoing connection to</td></tr><trid="65"style="display: none;"colspan="3"><tdcolspan="3"><h2>test logic for which connection to keep when receiving an incoming connection to the same peer as we just made an outgoing connection to</h2><h4>../test/test_policy.cpp:424</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"></pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(66)">../test/test_policy.cpp:425</a></td><td>test update_peer_port with allow_multiple_connections_per_ip</td></tr><trid="66"style="display: none;"colspan="3"><tdcolspan="3"><h2>test update_peer_port with allow_multiple_connections_per_ip</h2><h4>../test/test_policy.cpp:425</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"></pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(67)">../test/test_policy.cpp:426</a></td><td>test set_seed</td></tr><trid="67"style="display: none;"colspan="3"><tdcolspan="3"><h2>test set_seed</h2><h4>../test/test_policy.cpp:426</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"></pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(68)">../test/test_policy.cpp:427</a></td><td>test has_peer</td></tr><trid="68"style="display: none;"colspan="3"><tdcolspan="3"><h2>test has_peer</h2><h4>../test/test_policy.cpp:427</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"></pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(69)">../test/test_policy.cpp:428</a></td><td>test insert_peer with a full list</td></tr><trid="69"style="display: none;"colspan="3"><tdcolspan="3"><h2>test insert_peer with a full list</h2><h4>../test/test_policy.cpp:428</h4><prestyle="background:#f6f6f6;border:soli
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(78)">../test/test_primitives.cpp:213</a></td><td>test the case where we have > 120 samples (and have the base delay actually be updated)</td></tr><trid="78"style="display: none;"colspan="3"><tdcolspan="3"><h2>test the case where we have > 120 samples (and have the base delay actually be updated)</h2><h4>../test/test_primitives.cpp:213</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"></pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(79)">../test/test_primitives.cpp:214</a></td><td>test the case where a sample is lower than the history entry but not lower than the base</td></tr><trid="79"style="display: none;"colspan="3"><tdcolspan="3"><h2>test the case where a sample is lower than the history entry but not lower than the base</h2><h4>../test/test_primitives.cpp:214</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> TEST_CHECK(!filter.find(k3));
TEST_CHECK(filter.find(k4));
// test timestamp_history
{
timestamp_history h;
TEST_EQUAL(h.add_sample(0x32, false), 0);
TEST_EQUAL(h.base(), 0x32);
TEST_EQUAL(h.add_sample(0x33, false), 0x1);
TEST_EQUAL(h.base(), 0x32);
TEST_EQUAL(h.add_sample(0x3433, false), 0x3401);
TEST_EQUAL(h.base(), 0x32);
TEST_EQUAL(h.add_sample(0x30, false), 0);
TEST_EQUAL(h.base(), 0x30);
// test that wrapping of the timestamp is properly handled
TEST_CHECK(error_code(errors::service_unavailable, get_http_category()).message() == "503 Service Unavailable");
// test snprintf
char msg[10];
snprintf(msg, sizeof(msg), "too %s format string", "long");
TEST_CHECK(strcmp(msg, "too long ") == 0);
std::string path;
sanitize_append_path_element(path, "a...", 4);
TEST_EQUAL(path, "a");
path.clear();
sanitize_append_path_element(path, "a ", 4);
TEST_EQUAL(path, "a");
path.clear();
sanitize_append_path_element(path, "a...b", 5);
TEST_EQUAL(path, "a...b");
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(80)">../test/test_rss.cpp:136</a></td><td>verify some key state is saved in 'state'</td></tr><trid="80"style="display: none;"colspan="3"><tdcolspan="3"><h2>verify some key state is saved in 'state'</h2><h4>../test/test_rss.cpp:136</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> feed_status st;
test_feed(combine_path(root_dir, "kat.xml"), rss_expect(25, "http://kat.ph/torrents/benito-di-paula-1975-benito-di-paula-lp-rip-ogg-at-500-jarax4u-t6194897/", "Benito Di Paula - 1975 - Benito Di Paula (LP Rip OGG at 500) [jarax4u]", 168773863));
test_feed(combine_path(root_dir, "mn.xml"), rss_expect(20, "http://www.mininova.org/get/13203100", "Dexcell - January TwentyTwelve Mix", 137311179));
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(81)">../test/test_ssl.cpp:344</a></td><td>test using a signed certificate with the wrong info-hash in DN</td></tr><trid="81"style="display: none;"colspan="3"><tdcolspan="3"><h2>test using a signed certificate with the wrong info-hash in DN</h2><h4>../test/test_ssl.cpp:344</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> // in verifying peers
ctx.set_verify_mode(context::verify_none, ec);
if (ec)
{
fprintf(stderr, "Failed to set SSL verify mode: %s\n"
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(82)">../test/test_ssl.cpp:442</a></td><td>also test using a hash that refers to a valid torrent but that differs from the SNI hash</td></tr><trid="82"style="display: none;"colspan="3"><tdcolspan="3"><h2>also test using a hash that refers to a valid torrent
but that differs from the SNI hash</h2><h4>../test/test_ssl.cpp:442</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> print_alerts(ses1, "ses1", true, true, true, &on_alert);
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(83)">../test/test_torrent.cpp:132</a></td><td>wait for an alert rather than just waiting 10 seconds. This is kind of silly</td></tr><trid="83"style="display: none;"colspan="3"><tdcolspan="3"><h2>wait for an alert rather than just waiting 10 seconds. This is kind of silly</h2><h4>../test/test_torrent.cpp:132</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> TEST_EQUAL(h.file_priorities().size(), info->num_files());
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(84)">../test/test_torrent_parse.cpp:114</a></td><td>test remap_files</td></tr><trid="84"style="display: none;"colspan="3"><tdcolspan="3"><h2>test remap_files</h2><h4>../test/test_torrent_parse.cpp:114</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"></pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(85)">../test/test_torrent_parse.cpp:115</a></td><td>merkle torrents. specifically torrent_info::add_merkle_nodes and torrent with "root hash"</td></tr><trid="85"style="display: none;"colspan="3"><tdcolspan="3"><h2>merkle torrents. specifically torrent_info::add_merkle_nodes and torrent with "root hash"</h2><h4>../test/test_torrent_parse.cpp:115</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"></pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(86)">../test/test_torrent_parse.cpp:116</a></td><td>torrent with 'p' (padfile) attribute</td></tr><trid="86"style="display: none;"colspan="3"><tdcolspan="3"><h2>torrent with 'p' (padfile) attribute</h2><h4>../test/test_torrent_parse.cpp:116</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"></pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(87)">../test/test_torrent_parse.cpp:117</a></td><td>torrent with 'h' (hidden) attribute</td></tr><trid="87"style="display: none;"colspan="3"><tdcolspan="3"><h2>torrent with 'h' (hidden) attribute</h2><h4>../test/test_torrent_parse.cpp:117</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"></pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(88)">../test/test_torrent_parse.cpp:118</a></td><td>torrent with 'x' (executable) attribute</td></tr><trid="88"style="display: none;"colspan="3"><tdcolspan="3"><h2>torrent with 'x' (executable) attribute</h2><h4>../test/test_torrent_parse.cpp:118</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"></pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(89)">../test/test_torrent_parse.cpp:119</a></td><td>torrent with 'l' (symlink) attribute</td></tr><trid="89"style="display: none;"colspan="3"><tdcolspan="3"><h2>torrent with 'l' (symlink) attribute</h2><h4>../test/test_torrent_parse.cpp:119</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"></pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(90)">../test/test_torrent_parse.cpp:120</a></td><td>creating a merkle torrent (torrent_info::build_merkle_list)</td></tr><trid="90"style="display: none;"colspan="3"><tdcolspan="3"><h2>creating a merkle torrent (torrent_info::build_merkle_list)</h2><h4>../test/test_torrent_parse.cpp:120</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"></pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(91)">../test/test_torrent_parse.cpp:121</a></td><td>torrent with multiple trackers in multiple tiers, making sure we shuffle them (how do you test shuffling?, load it multiple times and make sure it's in different order at least once)</td></tr><trid="91"style="display: none;"colspan="3"><tdcolspan="3"><h2>torrent with multiple trackers in multiple tiers, making sure we shuffle them (how do you test shuffling?, load it multiple times and make sure it's in different order at least once)</h2><h4>../test/test_torrent_parse.cpp:121</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> { "invalid_info.torrent", errors::torrent_missing_info },
TORRENT_EXTRA_EXPORT void sanitize_append_path_element(std::string& p, char const* element, int len);
}
<divstyle="background: #ffff00"width="100%">
</div>int test_main()
{
error_code ec;
// test merkle_*() functions
// this is the structure:
// 0
// 1 2
// 3 4 5 6
// 7 8 9 10 11 12 13 14
// num_leafs = 8
TEST_EQUAL(merkle_num_leafs(1), 1);
TEST_EQUAL(merkle_num_leafs(2), 2);
TEST_EQUAL(merkle_num_leafs(3), 4);
TEST_EQUAL(merkle_num_leafs(4), 4);
TEST_EQUAL(merkle_num_leafs(5), 8);
TEST_EQUAL(merkle_num_leafs(6), 8);
TEST_EQUAL(merkle_num_leafs(7), 8);
TEST_EQUAL(merkle_num_leafs(8), 8);
TEST_EQUAL(merkle_num_leafs(9), 16);
TEST_EQUAL(merkle_num_leafs(10), 16);
TEST_EQUAL(merkle_num_leafs(11), 16);
TEST_EQUAL(merkle_num_leafs(12), 16);
TEST_EQUAL(merkle_num_leafs(13), 16);
TEST_EQUAL(merkle_num_leafs(14), 16);
TEST_EQUAL(merkle_num_leafs(15), 16);
TEST_EQUAL(merkle_num_leafs(16), 16);
TEST_EQUAL(merkle_num_leafs(17), 32);
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(92)">../test/test_tracker.cpp:198</a></td><td>test parse peers6</td></tr><trid="92"style="display: none;"colspan="3"><tdcolspan="3"><h2>test parse peers6</h2><h4>../test/test_tracker.cpp:198</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"></pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(93)">../test/test_tracker.cpp:199</a></td><td>test parse tracker-id</td></tr><trid="93"style="display: none;"colspan="3"><tdcolspan="3"><h2>test parse tracker-id</h2><h4>../test/test_tracker.cpp:199</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"></pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(94)">../test/test_tracker.cpp:200</a></td><td>test parse failure-reason</td></tr><trid="94"style="display: none;"colspan="3"><tdcolspan="3"><h2>test parse failure-reason</h2><h4>../test/test_tracker.cpp:200</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"></pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(95)">../test/test_tracker.cpp:201</a></td><td>test all failure paths invalid bencoding not a dictionary no files entry in scrape response no info-hash entry in scrape response malformed peers in peer list of dictionaries uneven number of bytes in peers and peers6 string responses</td></tr><trid="95"style="display: none;"colspan="3"><tdcolspan="3"><h2>test all failure paths
invalid bencoding
not a dictionary
no files entry in scrape response
no info-hash entry in scrape response
malformed peers in peer list of dictionaries
uneven number of bytes in peers and peers6 string responses</h2><h4>../test/test_tracker.cpp:201</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> TEST_EQUAL(ec, error_code());
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(96)">../test/test_upnp.cpp:101</a></td><td>store the log and verify that some key messages are there</td></tr><trid="96"style="display: none;"colspan="3"><tdcolspan="3"><h2>store the log and verify that some key messages are there</h2><h4>../test/test_upnp.cpp:101</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> "USN:uuid:000f-66d6-7296000099dc::upnp:rootdevice\r\n"
"Location: http://127.0.0.1:%d/upnp.xml\r\n"
"Server: Custom/1.0 UPnP/1.0 Proc/Ver\r\n"
"EXT:\r\n"
"Cache-Control:max-age=180\r\n"
"DATE: Fri, 02 Jan 1970 08:10:38 GMT\r\n\r\n";
TORRENT_ASSERT(g_port != 0);
char buf[sizeof(msg) + 30];
int len = snprintf(buf, sizeof(buf), msg, g_port);
int run_upnp_test(char const* root_filename, char const* router_model, char const* control_name)
{
libtorrent::io_service ios;
g_port = start_web_server();
std::vector<char> buf;
error_code ec;
load_file(root_filename, buf, ec);
buf.push_back(0);
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(97)">../test/web_seed_suite.cpp:373</a></td><td>file hashes don't work with the new torrent creator reading async</td></tr><trid="97"style="display: none;"colspan="3"><tdcolspan="3"><h2>file hashes don't work with the new torrent creator reading async</h2><h4>../test/web_seed_suite.cpp:373</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> // corrupt the files now, so that the web seed will be banned
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(98)">../src/block_cache.cpp:884</a></td><td>it's somewhat expensive to iterate over this linked list. Presumably because of the random access of memory. It would be nice if pieces with no evictable blocks weren't in this list</td></tr><trid="98"style="display: none;"colspan="3"><tdcolspan="3"><h2>it's somewhat expensive
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(99)">../src/block_cache.cpp:948</a></td><td>this should probably only be done every n:th time</td></tr><trid="99"style="display: none;"colspan="3"><tdcolspan="3"><h2>this should probably only be done every n:th time</h2><h4>../src/block_cache.cpp:948</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> }
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(100)">../src/block_cache.cpp:1720</a></td><td>create a holder for refcounts that automatically decrement</td></tr><trid="100"style="display: none;"colspan="3"><tdcolspan="3"><h2>create a holder for refcounts that automatically decrement</h2><h4>../src/block_cache.cpp:1720</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> }
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(101)">../src/bt_peer_connection.cpp:646</a></td><td>this could be optimized using knuth morris pratt</td></tr><trid="101"style="display: none;"colspan="3"><tdcolspan="3"><h2>this could be optimized using knuth morris pratt</h2><h4>../src/bt_peer_connection.cpp:646</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> {
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(103)">../src/disk_io_thread.cpp:921</a></td><td>instead of doing a lookup each time through the loop, save cached_piece_entry pointers with piece_refcount incremented to pin them</td></tr><trid="103"style="display: none;"colspan="3"><tdcolspan="3"><h2>instead of doing a lookup each time through the loop, save
cached_piece_entry pointers with piece_refcount incremented to pin them</h2><h4>../src/disk_io_thread.cpp:921</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> // this is why we pass in 1 as cont_block to the flushing functions
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(104)">../src/disk_io_thread.cpp:1132</a></td><td>instead of doing this. pass in the settings to each storage_interface call. Each disk thread could hold its most recent understanding of the settings in a shared_ptr, and update it every time it wakes up from a job. That way each access to the settings won't require a mutex to be held.</td></tr><trid="104"style="display: none;"colspan="3"><tdcolspan="3"><h2>instead of doing this. pass in the settings to each storage_interface
call. Each disk thread could hold its most recent understanding of the settings
in a shared_ptr, and update it every time it wakes up from a job. That way
each access to the settings won't require a mutex to be held.</h2><h4>../src/disk_io_thread.cpp:1132</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> {
INVARIANT_CHECK;
TORRENT_ASSERT(j->next == 0);
TORRENT_ASSERT((j->flags & disk_io_job::in_progress) || !j->storage);
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(105)">../src/disk_io_thread.cpp:1157</a></td><td>a potentially more efficient solution would be to have a special queue for retry jobs, that's only ever run when a job completes, in any thread. It would only work if m_outstanding_jobs > 0</td></tr><trid="105"style="display: none;"colspan="3"><tdcolspan="3"><h2>a potentially more efficient solution would be to have a special
queue for retry jobs, that's only ever run when a job completes, in
any thread. It would only work if m_outstanding_jobs > 0</h2><h4>../src/disk_io_thread.cpp:1157</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> storage->get_storage_impl()->m_settings = &m_settings;
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(106)">../src/disk_io_thread.cpp:1171</a></td><td>it should clear the hash state even when there's an error, right?</td></tr><trid="106"style="display: none;"colspan="3"><tdcolspan="3"><h2>it should clear the hash state even when there's an error, right?</h2><h4>../src/disk_io_thread.cpp:1171</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> --m_outstanding_jobs;
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(107)">../src/disk_io_thread.cpp:1866</a></td><td>maybe the tailqueue_iterator should contain a pointer-pointer instead and have an unlink function</td></tr><trid="107"style="display: none;"colspan="3"><tdcolspan="3"><h2>maybe the tailqueue_iterator should contain a pointer-pointer
instead and have an unlink function</h2><h4>../src/disk_io_thread.cpp:1866</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> j->callback = handler;
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(108)">../src/disk_io_thread.cpp:2121</a></td><td>this is potentially very expensive. One way to solve it would be to have a fence for just this one piece.</td></tr><trid="108"style="display: none;"colspan="3"><tdcolspan="3"><h2>this is potentially very expensive. One way to solve
it would be to have a fence for just this one piece.</h2><h4>../src/disk_io_thread.cpp:2121</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> }
void disk_io_thread::async_clear_piece(piece_manager* storage, int index
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(109)">../src/disk_io_thread.cpp:2382</a></td><td>we should probably just hang the job on the piece and make sure the hasher gets kicked</td></tr><trid="109"style="display: none;"colspan="3"><tdcolspan="3"><h2>we should probably just hang the job on the piece and make sure the hasher gets kicked</h2><h4>../src/disk_io_thread.cpp:2382</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> if (pe == NULL)
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(110)">../src/disk_io_thread.cpp:2452</a></td><td>introduce a holder class that automatically increments and decrements the piece_refcount</td></tr><trid="110"style="display: none;"colspan="3"><tdcolspan="3"><h2>introduce a holder class that automatically increments
and decrements the piece_refcount</h2><h4>../src/disk_io_thread.cpp:2452</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> for (int i = ph->offset / block_size; i < blocks_in_piece; ++i)
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(111)">../src/disk_io_thread.cpp:2692</a></td><td>it would be nice to not have to lock the mutex every turn through this loop</td></tr><trid="111"style="display: none;"colspan="3"><tdcolspan="3"><h2>it would be nice to not have to lock the mutex every
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(112)">../src/http_tracker_connection.cpp:96</a></td><td>support authentication (i.e. user name and password) in the URL</td></tr><trid="112"style="display: none;"colspan="3"><tdcolspan="3"><h2>support authentication (i.e. user name and password) in the URL</h2><h4>../src/http_tracker_connection.cpp:96</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> , tracker_request const& req
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(113)">../src/metadata_transfer.cpp:359</a></td><td>this is not safe. The torrent could be unloaded while we're still sending the metadata</td></tr><trid="113"style="display: none;"colspan="3"><tdcolspan="3"><h2>this is not safe. The torrent could be unloaded while
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(114)">../src/packet_buffer.cpp:176</a></td><td>use compare_less_wrap for this comparison as well</td></tr><trid="114"style="display: none;"colspan="3"><tdcolspan="3"><h2>use compare_less_wrap for this comparison as well</h2><h4>../src/packet_buffer.cpp:176</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> while (new_size < size)
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(115)">../src/part_file.cpp:252</a></td><td>what do we do if someone is currently reading from the disk from this piece? does it matter? Since we won't actively erase the data from disk, but it may be overwritten soon, it's probably not that big of a deal</td></tr><trid="115"style="display: none;"colspan="3"><tdcolspan="3"><h2>what do we do if someone is currently reading from the disk
from this piece? does it matter? Since we won't actively erase the
data from disk, but it may be overwritten soon, it's probably not that
big of a deal</h2><h4>../src/part_file.cpp:252</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> if (((mode & file::rw_mask) != file::read_only)
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(116)">../src/part_file.cpp:344</a></td><td>instead of rebuilding the whole file header and flushing it, update the slot entries as we go</td></tr><trid="116"style="display: none;"colspan="3"><tdcolspan="3"><h2>instead of rebuilding the whole file header
and flushing it, update the slot entries as we go</h2><h4>../src/part_file.cpp:344</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> if (block_to_copy == m_piece_size)
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(117)">../src/peer_connection.cpp:1140</a></td><td>this should be the global download rate</td></tr><trid="117"style="display: none;"colspan="3"><tdcolspan="3"><h2>this should be the global download rate</h2><h4>../src/peer_connection.cpp:1140</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;">
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(118)">../src/peer_connection.cpp:3373</a></td><td>sort the allowed fast set in priority order</td></tr><trid="118"style="display: none;"colspan="3"><tdcolspan="3"><h2>sort the allowed fast set in priority order</h2><h4>../src/peer_connection.cpp:3373</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;">
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(119)">../src/piece_picker.cpp:2407</a></td><td>when expanding pieces for cache stripe reasons, the !downloading condition doesn't make much sense</td></tr><trid="119"style="display: none;"colspan="3"><tdcolspan="3"><h2>when expanding pieces for cache stripe reasons,
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(120)">../src/session_impl.cpp:673</a></td><td>there's no rule here to make uTP connections not have the global or local rate limits apply to it. This used to be the default.</td></tr><trid="120"style="display: none;"colspan="3"><tdcolspan="3"><h2>there's no rule here to make uTP connections not have the global or
local rate limits apply to it. This used to be the default.</h2><h4>../src/session_impl.cpp:673</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> m_global_class = m_classes.new_peer_class("global");
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(121)">../src/session_impl.cpp:2238</a></td><td>instead of having a special case for this, just make the default listen interfaces be "0.0.0.0:6881,[::1]:6881" and use the generic path. That would even allow for not listening at all.</td></tr><trid="121"style="display: none;"colspan="3"><tdcolspan="3"><h2>instead of having a special case for this, just make the
the generic path. That would even allow for not listening at all.</h2><h4>../src/session_impl.cpp:2238</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;">
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(122)">../src/session_impl.cpp:3083</a></td><td>should this function take a shared_ptr instead?</td></tr><trid="122"style="display: none;"colspan="3"><tdcolspan="3"><h2>should this function take a shared_ptr instead?</h2><h4>../src/session_impl.cpp:3083</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> {
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(123)">../src/session_impl.cpp:3439</a></td><td>have a separate list for these connections, instead of having to loop through all of them</td></tr><trid="123"style="display: none;"colspan="3"><tdcolspan="3"><h2>have a separate list for these connections, instead of having to loop through all of them</h2><h4>../src/session_impl.cpp:3439</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> if (m_auto_manage_time_scaler < 0)
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(124)">../src/session_impl.cpp:3480</a></td><td>this should apply to all bandwidth channels</td></tr><trid="124"style="display: none;"colspan="3"><tdcolspan="3"><h2>this should apply to all bandwidth channels</h2><h4>../src/session_impl.cpp:3480</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> t.second_tick(tick_interval_ms, m_tick_residual / 1000);
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(125)">../src/session_impl.cpp:4543</a></td><td>these vectors could be copied from m_torrent_lists, if we would maintain them. That way the first pass over all torrents could be avoided. It would be especially efficient if most torrents are not auto-managed whenever we receive a scrape response (or anything that may change the rank of a torrent) that one torrent could re-sort itself in a list that's kept sorted at all times. That way, this pass over all torrents could be avoided alltogether.</td></tr><trid="125"style="display: none;"colspan="3"><tdcolspan="3"><h2>these vectors could be copied from m_torrent_lists,
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(126)">../src/session_impl.cpp:4618</a></td><td>allow extensions to sort torrents for queuing</td></tr><trid="126"style="display: none;"colspan="3"><tdcolspan="3"><h2>allow extensions to sort torrents for queuing</h2><h4>../src/session_impl.cpp:4618</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> if (t->is_finished())
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(127)">../src/session_impl.cpp:4796</a></td><td>use a lower limit than m_settings.connections_limit to allocate the to 10% or so of connection slots for incoming connections</td></tr><trid="127"style="display: none;"colspan="3"><tdcolspan="3"><h2>use a lower limit than m_settings.connections_limit
connections</h2><h4>../src/session_impl.cpp:4796</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> // if we don't have any free slots, return
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(128)">../src/session_impl.cpp:4959</a></td><td>post a message to have this happen immediately instead of waiting for the next tick</td></tr><trid="128"style="display: none;"colspan="3"><tdcolspan="3"><h2>post a message to have this happen
immediately instead of waiting for the next tick</h2><h4>../src/session_impl.cpp:4959</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> // we've unchoked this peer, and it hasn't reciprocated
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(131)">../src/session_impl.cpp:5086</a></td><td>this should be called for all peers!</td></tr><trid="131"style="display: none;"colspan="3"><tdcolspan="3"><h2>this should be called for all peers!</h2><h4>../src/session_impl.cpp:5086</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> // we don't know at what rate we can upload. If we have a
// measurement of the peak, use that + 10kB/s, otherwise
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(132)">../src/session_impl.cpp:5501</a></td><td>it might be a nice feature here to limit the number of torrents to send in a single update. By just posting the first n torrents, they would nicely be round-robined because the torrent lists are always pushed back</td></tr><trid="132"style="display: none;"colspan="3"><tdcolspan="3"><h2>it might be a nice feature here to limit the number of torrents
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(133)">../src/storage.cpp:710</a></td><td>make this more generic to not just work if files have been renamed, but also if they have been merged into a single file for instance maybe use the same format as .torrent files and reuse some code from torrent_info</td></tr><trid="133"style="display: none;"colspan="3"><tdcolspan="3"><h2>make this more generic to not just work if files have been
renamed, but also if they have been merged into a single file for instance
maybe use the same format as .torrent files and reuse some code from torrent_info</h2><h4>../src/storage.cpp:710</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> for (;;)
{
if (file_offset < files().file_size(file_index))
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(134)">../src/storage.cpp:1006</a></td><td>if everything moves OK, except for the partfile we currently won't update the save path, which breaks things. it would probably make more sense to give up on the partfile</td></tr><trid="134"style="display: none;"colspan="3"><tdcolspan="3"><h2>if everything moves OK, except for the partfile
we currently won't update the save path, which breaks things.
it would probably make more sense to give up on the partfile</h2><h4>../src/storage.cpp:1006</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> if (ec)
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(135)">../src/torrent.cpp:492</a></td><td>if the existing torrent doesn't have metadata, insert the metadata we just downloaded into it.</td></tr><trid="135"style="display: none;"colspan="3"><tdcolspan="3"><h2>if the existing torrent doesn't have metadata, insert
the metadata we just downloaded into it.</h2><h4>../src/torrent.cpp:492</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;">
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(136)">../src/torrent.cpp:642</a></td><td>if the existing torrent doesn't have metadata, insert the metadata we just downloaded into it.</td></tr><trid="136"style="display: none;"colspan="3"><tdcolspan="3"><h2>if the existing torrent doesn't have metadata, insert
the metadata we just downloaded into it.</h2><h4>../src/torrent.cpp:642</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;">
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(137)">../src/torrent.cpp:1447</a></td><td>is verify_peer_cert called once per certificate in the chain, and this function just tells us which depth we're at right now? If so, the comment makes sense. any certificate that isn't the leaf (i.e. the one presented by the peer) should be accepted automatically, given preverified is true. The leaf certificate need to be verified to make sure its DN matches the info-hash</td></tr><trid="137"style="display: none;"colspan="3"><tdcolspan="3"><h2>is verify_peer_cert called once per certificate in the chain, and
need to be verified to make sure its DN matches the info-hash</h2><h4>../src/torrent.cpp:1447</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> if (pp) p->add_extension(pp);
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(138)">../src/torrent.cpp:1839</a></td><td>instead of creating the picker up front here, maybe this whole section should move to need_picker()</td></tr><trid="138"style="display: none;"colspan="3"><tdcolspan="3"><h2>instead of creating the picker up front here,
maybe this whole section should move to need_picker()</h2><h4>../src/torrent.cpp:1839</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> else
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(139)">../src/torrent.cpp:2035</a></td><td>there may be peer extensions relying on the torrent extension still being alive. Only do this if there are no peers. And when the last peer is disconnected, if the torrent is unloaded, clear the extensions m_extensions.clear();</td></tr><trid="139"style="display: none;"colspan="3"><tdcolspan="3"><h2>there may be peer extensions relying on the torrent extension
m_extensions.clear();</h2><h4>../src/torrent.cpp:2035</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> // pinned torrents are not allowed to be swapped out
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(140)">../src/torrent.cpp:2708</a></td><td>this pattern is repeated in a few places. Factor this into a function and generalize the concept of a torrent having a dedicated listen port</td></tr><trid="140"style="display: none;"colspan="3"><tdcolspan="3"><h2>this pattern is repeated in a few places. Factor this into
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(141)">../src/torrent.cpp:3483</a></td><td>add one peer per IP the hostname resolves to</td></tr><trid="141"style="display: none;"colspan="3"><tdcolspan="3"><h2>add one peer per IP the hostname resolves to</h2><h4>../src/torrent.cpp:3483</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;">#endif
void torrent::on_peer_name_lookup(error_code const& e
, std::vector<address> const& host_list, int port)
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(143)">../src/torrent.cpp:4617</a></td><td>really, we should just keep the picker around in this case to maintain the availability counters</td></tr><trid="143"style="display: none;"colspan="3"><tdcolspan="3"><h2>really, we should just keep the picker around
in this case to maintain the availability counters</h2><h4>../src/torrent.cpp:4617</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> pieces.reserve(cs.pieces.size());
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(144)">../src/torrent.cpp:6549</a></td><td>make this more generic to not just work if files have been renamed, but also if they have been merged into a single file for instance maybe use the same format as .torrent files and reuse some code from torrent_info The mapped_files needs to be read both in the network thread and in the disk thread, since they both have their own mapped files structures which are kept in sync</td></tr><trid="144"style="display: none;"colspan="3"><tdcolspan="3"><h2>make this more generic to not just work if files have been
which are kept in sync</h2><h4>../src/torrent.cpp:6549</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> super_seeding(rd.dict_find_int_value("super_seeding", 0));
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(145)">../src/torrent.cpp:6712</a></td><td>if this is a merkle torrent and we can't restore the tree, we need to wipe all the bits in the have array, but not necessarily we might want to do a full check to see if we have all the pieces. This is low priority since almost no one uses merkle torrents</td></tr><trid="145"style="display: none;"colspan="3"><tdcolspan="3"><h2>if this is a merkle torrent and we can't
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(146)">../src/torrent.cpp:6902</a></td><td>make this more generic to not just work if files have been renamed, but also if they have been merged into a single file for instance. using file_base</td></tr><trid="146"style="display: none;"colspan="3"><tdcolspan="3"><h2>make this more generic to not just work if files have been
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(147)">../src/torrent.cpp:8888</a></td><td>add a flag to ignore stats, and only care about resume data for content. For unchanged files, don't trigger a load of the metadata just to save an empty resume data file</td></tr><trid="147"style="display: none;"colspan="3"><tdcolspan="3"><h2>add a flag to ignore stats, and only care about resume data for
just to save an empty resume data file</h2><h4>../src/torrent.cpp:8888</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> if (m_complete != 0xffffff) seeds = m_complete;
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(148)">../src/torrent.cpp:9855</a></td><td>go through the pieces we have and count the total number of downloaders we have. Only count peers that are interested in us since some peers might not send have messages for pieces we have it num_interested == 0, we need to pick a new piece</td></tr><trid="148"style="display: none;"colspan="3"><tdcolspan="3"><h2>go through the pieces we have and count the total number
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(149)">../src/torrent.cpp:10501</a></td><td>instead of resorting the whole list, insert the peers directly into the right place</td></tr><trid="149"style="display: none;"colspan="3"><tdcolspan="3"><h2>instead of resorting the whole list, insert the peers
directly into the right place</h2><h4>../src/torrent.cpp:10501</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> printf("timed out [average-piece-time: %d ms ]\n"
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(150)">../src/torrent_peer.cpp:176</a></td><td>how do we deal with our external address changing?</td></tr><trid="150"style="display: none;"colspan="3"><tdcolspan="3"><h2>how do we deal with our external address changing?</h2><h4>../src/torrent_peer.cpp:176</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> , is_v6_addr(false)
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(151)">../src/udp_socket.cpp:290</a></td><td>it would be nice to detect this on posix systems also</td></tr><trid="151"style="display: none;"colspan="3"><tdcolspan="3"><h2>it would be nice to detect this on posix systems also</h2><h4>../src/udp_socket.cpp:290</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> --m_v6_outstanding;
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(152)">../src/upnp.cpp:72</a></td><td>listen_interface is not used. It's meant to bind the broadcast socket</td></tr><trid="152"style="display: none;"colspan="3"><tdcolspan="3"><h2>listen_interface is not used. It's meant to bind the broadcast socket</h2><h4>../src/upnp.cpp:72</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;">#include <asio/ip/multicast.hpp>
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(153)">../src/ut_metadata.cpp:320</a></td><td>we really need to increment the refcounter on the torrent while this buffer is still in the peer's send buffer</td></tr><trid="153"style="display: none;"colspan="3"><tdcolspan="3"><h2>we really need to increment the refcounter on the torrent
while this buffer is still in the peer's send buffer</h2><h4>../src/ut_metadata.cpp:320</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> if (!m_tp.need_loaded()) return;
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(154)">../src/utp_stream.cpp:1627</a></td><td>this loop may not be very efficient</td></tr><trid="154"style="display: none;"colspan="3"><tdcolspan="3"><h2>this loop may not be very efficient</h2><h4>../src/utp_stream.cpp:1627</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;">
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(155)">../src/web_connection_base.cpp:73</a></td><td>introduce a web-seed default class which has a low download priority</td></tr><trid="155"style="display: none;"colspan="3"><tdcolspan="3"><h2>introduce a web-seed default class which has a low download priority</h2><h4>../src/web_connection_base.cpp:73</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;">{
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(156)">../src/kademlia/dht_tracker.cpp:428</a></td><td>ideally this function would be called when the put completes</td></tr><trid="156"style="display: none;"colspan="3"><tdcolspan="3"><h2>ideally this function would be called when the
put completes</h2><h4>../src/kademlia/dht_tracker.cpp:428</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> // since it controls whether we re-put the content
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(157)">../src/kademlia/routing_table.cpp:316</a></td><td>instad of refreshing a bucket by using find_nodes, ping each node periodically</td></tr><trid="157"style="display: none;"colspan="3"><tdcolspan="3"><h2>instad of refreshing a bucket by using find_nodes,
ping each node periodically</h2><h4>../src/kademlia/routing_table.cpp:316</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> os << "]\n";
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(159)">../include/libtorrent/block_cache.hpp:218</a></td><td>make this 32 bits and to count seconds since the block cache was created</td></tr><trid="159"style="display: none;"colspan="3"><tdcolspan="3"><h2>make this 32 bits and to count seconds since the block cache was created</h2><h4>../include/libtorrent/block_cache.hpp:218</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> bool operator==(cached_piece_entry const& rhs) const
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(160)">../include/libtorrent/config.hpp:339</a></td><td>Make this count Unicode characters instead of bytes on windows</td></tr><trid="160"style="display: none;"colspan="3"><tdcolspan="3"><h2>Make this count Unicode characters instead of bytes on windows</h2><h4>../include/libtorrent/config.hpp:339</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;">#define TORRENT_USE_WRITEV 0
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(161)">../include/libtorrent/debug.hpp:215</a></td><td>rewrite this class to use FILE* instead and have a printf-like interface</td></tr><trid="161"style="display: none;"colspan="3"><tdcolspan="3"><h2>rewrite this class to use FILE* instead and
have a printf-like interface</h2><h4>../include/libtorrent/debug.hpp:215</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;">#endif
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(162)">../include/libtorrent/disk_buffer_pool.hpp:133</a></td><td>try to remove the observers, only using the async_allocate handlers</td></tr><trid="162"style="display: none;"colspan="3"><tdcolspan="3"><h2>try to remove the observers, only using the async_allocate handlers</h2><h4>../include/libtorrent/disk_buffer_pool.hpp:133</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;">
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(163)">../include/libtorrent/peer_connection.hpp:217</a></td><td>make this a raw pointer (to save size in the first cache line) and make the constructor take a raw pointer. torrent objects should always outlive their peers</td></tr><trid="163"style="display: none;"colspan="3"><tdcolspan="3"><h2>make this a raw pointer (to save size in
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(164)">../include/libtorrent/peer_connection.hpp:1144</a></td><td>factor this out into its own class with a virtual interface torrent and session should implement this interface</td></tr><trid="164"style="display: none;"colspan="3"><tdcolspan="3"><h2>factor this out into its own class with a virtual interface
torrent and session should implement this interface</h2><h4>../include/libtorrent/peer_connection.hpp:1144</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;">
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(165)">../include/libtorrent/peer_connection_interface.hpp:45</a></td><td>make this interface smaller!</td></tr><trid="165"style="display: none;"colspan="3"><tdcolspan="3"><h2>make this interface smaller!</h2><h4>../include/libtorrent/peer_connection_interface.hpp:45</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;">SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(166)">../include/libtorrent/performance_counters.hpp:132</a></td><td>should keepalives be in here too? how about dont-have, share-mode, upload-only</td></tr><trid="166"style="display: none;"colspan="3"><tdcolspan="3"><h2>should keepalives be in here too?
how about dont-have, share-mode, upload-only</h2><h4>../include/libtorrent/performance_counters.hpp:132</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> // a connect candidate
connection_attempt_loops,
// successful incoming connections (not rejected for any reason)
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(167)">../include/libtorrent/performance_counters.hpp:406</a></td><td>some space could be saved here by making gauges 32 bits</td></tr><trid="167"style="display: none;"colspan="3"><tdcolspan="3"><h2>some space could be saved here by making gauges 32 bits</h2><h4>../include/libtorrent/performance_counters.hpp:406</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"></pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(168)">../include/libtorrent/performance_counters.hpp:407</a></td><td>restore these to regular integers. Instead have one copy of the counters per thread and collect them at convenient synchronization points</td></tr><trid="168"style="display: none;"colspan="3"><tdcolspan="3"><h2>restore these to regular integers. Instead have one copy
of the counters per thread and collect them at convenient
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(169)">../include/libtorrent/piece_picker.hpp:669</a></td><td>should this be allocated lazily?</td></tr><trid="169"style="display: none;"colspan="3"><tdcolspan="3"><h2>should this be allocated lazily?</h2><h4>../include/libtorrent/piece_picker.hpp:669</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> std::vector<downloading_piece>::const_iterator find_dl_piece(int queue, int index) const;
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(170)">../include/libtorrent/proxy_base.hpp:166</a></td><td>it would be nice to remember the bind port and bind once we know where the proxy is m_sock.bind(endpoint, ec);</td></tr><trid="170"style="display: none;"colspan="3"><tdcolspan="3"><h2>it would be nice to remember the bind port and bind once we know where the proxy is
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(172)">../include/libtorrent/settings_pack.hpp:1080</a></td><td>deprecate this ``max_rejects`` is the number of piece requests we will reject in a row while a peer is choked before the peer is considered abusive and is disconnected.</td></tr><trid="172"style="display: none;"colspan="3"><tdcolspan="3"><h2>deprecate this
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(173)">../include/libtorrent/size_type.hpp:48</a></td><td>remove these and just use boost's types directly</td></tr><trid="173"style="display: none;"colspan="3"><tdcolspan="3"><h2>remove these and just use boost's types directly</h2><h4>../include/libtorrent/size_type.hpp:48</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;">ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(175)">../include/libtorrent/torrent.hpp:1260</a></td><td>These two bitfields should probably be coalesced into one</td></tr><trid="175"style="display: none;"colspan="3"><tdcolspan="3"><h2>These two bitfields should probably be coalesced into one</h2><h4>../include/libtorrent/torrent.hpp:1260</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> // the .torrent file from m_url
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(176)">../include/libtorrent/torrent_info.hpp:124</a></td><td>include the number of peers received from this tracker, at last announce</td></tr><trid="176"style="display: none;"colspan="3"><tdcolspan="3"><h2>include the number of peers received from this tracker, at last announce</h2><h4>../include/libtorrent/torrent_info.hpp:124</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;">
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(177)">../include/libtorrent/upnp.hpp:113</a></td><td>support using the windows API for UPnP operations as well</td></tr><trid="177"style="display: none;"colspan="3"><tdcolspan="3"><h2>support using the windows API for UPnP operations as well</h2><h4>../include/libtorrent/upnp.hpp:113</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> // specific port
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(178)">../include/libtorrent/utp_stream.hpp:391</a></td><td>implement blocking write. Low priority since it's not used (yet)</td></tr><trid="178"style="display: none;"colspan="3"><tdcolspan="3"><h2>implement blocking write. Low priority since it's not used (yet)</h2><h4>../include/libtorrent/utp_stream.hpp:391</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> for (typename Mutable_Buffers::const_iterator i = buffers.begin()
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(179)">../include/libtorrent/kademlia/item.hpp:61</a></td><td>since this is a public function, it should probably be moved out of this header and into one with other public functions.</td></tr><trid="179"style="display: none;"colspan="3"><tdcolspan="3"><h2>since this is a public function, it should probably be moved
out of this header and into one with other public functions.</h2><h4>../include/libtorrent/kademlia/item.hpp:61</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;">#include <boost/array.hpp>
namespace libtorrent { namespace dht
{
// calculate the target hash for an immutable item.
sha1_hash TORRENT_EXTRA_EXPORT item_target_id(
std::pair<char const*, int> v);
// calculate the target hash for a mutable item.
sha1_hash TORRENT_EXTRA_EXPORT item_target_id(std::pair<char const*, int> salt
, char const* pk);
bool TORRENT_EXTRA_EXPORT verify_mutable_item(
std::pair<char const*, int> v
, std::pair<char const*, int> salt
, boost::uint64_t seq
, char const* pk
, char const* sig);
<divstyle="background: #ffff00"width="100%">
</div>// given a byte range ``v`` and an optional byte range ``salt``, a
// sequence number, public key ``pk`` (must be 32 bytes) and a secret key
// ``sk`` (must be 64 bytes), this function produces a signature which
// is written into a 64 byte buffer pointed to by ``sig``. The caller
// is responsible for allocating the destination buffer that's passed in
// as the ``sig`` argument. Typically it would be allocated on the stack.
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(180)">../include/libtorrent/aux_/session_impl.hpp:404</a></td><td>move the login info into the tracker_request object</td></tr><trid="180"style="display: none;"colspan="3"><tdcolspan="3"><h2>move the login info into the tracker_request object</h2><h4>../include/libtorrent/aux_/session_impl.hpp:404</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;">
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(181)">../include/libtorrent/aux_/session_impl.hpp:879</a></td><td>should this be renamed m_outgoing_interfaces?</td></tr><trid="181"style="display: none;"colspan="3"><tdcolspan="3"><h2>should this be renamed m_outgoing_interfaces?</h2><h4>../include/libtorrent/aux_/session_impl.hpp:879</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> // listen socket. For each retry the port number
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(182)">../include/libtorrent/aux_/session_impl.hpp:928</a></td><td>replace this by a proper asio timer</td></tr><trid="182"style="display: none;"colspan="3"><tdcolspan="3"><h2>replace this by a proper asio timer</h2><h4>../include/libtorrent/aux_/session_impl.hpp:928</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> mutable boost::uint8_t m_interface_index;
, bool ipv4, int port, int& retries, int flags, error_code& ec);
#ifndef TORRENT_DISABLE_DHT
entry m_dht_state;
#endif
// the number of unchoked peers as set by the auto-unchoker
// this should always be >= m_max_uploads
int m_allowed_upload_slots;
// this is initialized to the unchoke_interval
// session_setting and decreased every second.
// when it reaches zero, it is reset to the
// unchoke_interval and the unchoke set is
// recomputed.
<divstyle="background: #ffff00"width="100%"> int m_unchoke_time_scaler;
</div>
// this is used to decide when to recalculate which
// torrents to keep queued and which to activate
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(183)">../include/libtorrent/aux_/session_impl.hpp:933</a></td><td>replace this by a proper asio timer</td></tr><trid="183"style="display: none;"colspan="3"><tdcolspan="3"><h2>replace this by a proper asio timer</h2><h4>../include/libtorrent/aux_/session_impl.hpp:933</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> void setup_listener(listen_socket_t* s, std::string const& device
, bool ipv4, int port, int& retries, int flags, error_code& ec);
#ifndef TORRENT_DISABLE_DHT
entry m_dht_state;
#endif
// the number of unchoked peers as set by the auto-unchoker
// this should always be >= m_max_uploads
int m_allowed_upload_slots;
// this is initialized to the unchoke_interval
// session_setting and decreased every second.
// when it reaches zero, it is reset to the
// unchoke_interval and the unchoke set is
// recomputed.
int m_unchoke_time_scaler;
// this is used to decide when to recalculate which
// torrents to keep queued and which to activate
<divstyle="background: #ffff00"width="100%"> int m_auto_manage_time_scaler;
</div>
// works like unchoke_time_scaler but it
// is only decresed when the unchoke set
// is recomputed, and when it reaches zero,
// the optimistic unchoke is moved to another peer.
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(184)">../include/libtorrent/aux_/session_impl.hpp:940</a></td><td>replace this by a proper asio timer</td></tr><trid="184"style="display: none;"colspan="3"><tdcolspan="3"><h2>replace this by a proper asio timer</h2><h4>../include/libtorrent/aux_/session_impl.hpp:940</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;">
// the number of unchoked peers as set by the auto-unchoker
// this should always be >= m_max_uploads
int m_allowed_upload_slots;
// this is initialized to the unchoke_interval
// session_setting and decreased every second.
// when it reaches zero, it is reset to the
// unchoke_interval and the unchoke set is
// recomputed.
int m_unchoke_time_scaler;
// this is used to decide when to recalculate which
// torrents to keep queued and which to activate
int m_auto_manage_time_scaler;
// works like unchoke_time_scaler but it
// is only decresed when the unchoke set
// is recomputed, and when it reaches zero,
// the optimistic unchoke is moved to another peer.
<divstyle="background: #ffff00"width="100%"> int m_optimistic_unchoke_time_scaler;
</div>
// works like unchoke_time_scaler. Each time
// it reaches 0, and all the connections are
// used, the worst connection will be disconnected
// from the torrent with the most peers
int m_disconnect_time_scaler;
// when this scaler reaches zero, it will
// scrape one of the auto managed, paused,
// torrents.
int m_auto_scrape_time_scaler;
// the index of the torrent that we'll
// refresh the next time
int m_next_explicit_cache_torrent;
// this is a counter of the number of seconds until
// the next time the read cache is rotated, if we're
// using an explicit read read cache.
int m_cache_rotation_timer;
// the index of the torrent that we'll
// refresh the next time
int m_next_suggest_torrent;
// this is a counter of the number of seconds until
// the next time the suggest pieces are refreshed
int m_suggest_timer;
// statistics gathered from all torrents.
</pre></td></tr><trstyle="background: #ccc"><td>relevance 0</td><td><ahref="javascript:expand(185)">../include/libtorrent/aux_/session_interface.hpp:198</a></td><td>it would be nice to not have this be part of session_interface</td></tr><trid="185"style="display: none;"colspan="3"><tdcolspan="3"><h2>it would be nice to not have this be part of session_interface</h2><h4>../include/libtorrent/aux_/session_interface.hpp:198</h4><prestyle="background: #f6f6f6; border: solid 1px #ddd;"> virtual boost::uint16_t listen_port() const = 0;