lt sync 2796

This commit is contained in:
Andrew Resch 2008-10-14 16:13:23 +00:00
parent b5b6bb6e1e
commit 70a58e969f
8 changed files with 69 additions and 15 deletions

View File

@ -200,6 +200,9 @@ private:
std::vector<mapping_t> mapping; std::vector<mapping_t> mapping;
// this is the hostname, port and path
// component of the url or the control_url
// if it has been found
std::string hostname; std::string hostname;
int port; int port;
std::string path; std::string path;

View File

@ -169,15 +169,13 @@ namespace libtorrent
for (std::vector<ip_interface>::const_iterator i = interfaces.begin() for (std::vector<ip_interface>::const_iterator i = interfaces.begin()
, end(interfaces.end()); i != end; ++i) , end(interfaces.end()); i != end; ++i)
{ {
// only broadcast to IPv4 addresses that are not local
if (is_local(i->interface_address)) continue;
// only multicast on compatible networks // only multicast on compatible networks
if (i->interface_address.is_v4() != multicast_endpoint.address().is_v4()) continue; if (i->interface_address.is_v4() != multicast_endpoint.address().is_v4()) continue;
// ignore any loopback interface // ignore any loopback interface
if (is_loopback(i->interface_address)) continue; if (is_loopback(i->interface_address)) continue;
#ifndef NDEBUG #ifndef NDEBUG
// std::cerr << "broadcast socket [ if: " << i->to_v4().to_string() // std::cerr << "broadcast socket [ if: " << i->interface_address.to_v4().to_string()
// << " group: " << multicast_endpoint.address() << " ]" << std::endl; // << " group: " << multicast_endpoint.address() << " ]" << std::endl;
#endif #endif
open_unicast_socket(ios, i->interface_address); open_unicast_socket(ios, i->interface_address);

View File

@ -294,6 +294,14 @@ namespace libtorrent
if (rhs.m_peer_info) c2 = rhs.m_peer_info->total_upload(); if (rhs.m_peer_info) c2 = rhs.m_peer_info->total_upload();
else c2 = rhs.m_statistics.total_payload_upload(); else c2 = rhs.m_statistics.total_payload_upload();
// in order to not switch back and forth too often,
// unchoked peers must be at least one piece ahead
// of a choked peer to be sorted at a lower unchoke-priority
boost::shared_ptr<torrent> t = m_torrent.lock();
TORRENT_ASSERT(t);
if (!is_choked()) c1 -= t->torrent_file().piece_length();
if (!rhs.is_choked()) c2 -= t->torrent_file().piece_length();
return c1 < c2; return c1 < c2;
} }
@ -778,8 +786,6 @@ namespace libtorrent
// and if it can correspond to a request generated by libtorrent. // and if it can correspond to a request generated by libtorrent.
bool peer_connection::verify_piece(const peer_request& p) const bool peer_connection::verify_piece(const peer_request& p) const
{ {
INVARIANT_CHECK;
boost::shared_ptr<torrent> t = m_torrent.lock(); boost::shared_ptr<torrent> t = m_torrent.lock();
TORRENT_ASSERT(t); TORRENT_ASSERT(t);
@ -1616,7 +1622,7 @@ namespace libtorrent
#ifndef NDEBUG #ifndef NDEBUG
check_postcondition post_checker_(t); check_postcondition post_checker_(t);
#if !defined TORRENT_DISABLE_INVARIANT_CHECKS #if !defined TORRENT_DISABLE_INVARIANT_CHECKS && defined TORRENT_EXPENSIVE_INVARIANT_CHECKS
t->check_invariant(); t->check_invariant();
#endif #endif
#endif #endif
@ -1791,7 +1797,8 @@ namespace libtorrent
TORRENT_ASSERT(picker.num_peers(block_finished) == 0); TORRENT_ASSERT(picker.num_peers(block_finished) == 0);
#if !defined NDEBUG && !defined TORRENT_DISABLE_INVARIANT_CHECKS #if !defined NDEBUG && !defined TORRENT_DISABLE_INVARIANT_CHECKS \
&& defined TORRENT_EXPENSIVE_INVARIANT_CHECKS
t->check_invariant(); t->check_invariant();
#endif #endif
request_a_block(*t, *this); request_a_block(*t, *this);
@ -3064,7 +3071,9 @@ namespace libtorrent
void peer_connection::fill_send_buffer() void peer_connection::fill_send_buffer()
{ {
#ifdef TORRENT_EXPENSIVE_INVARIANT_CHECKS
INVARIANT_CHECK; INVARIANT_CHECK;
#endif
boost::shared_ptr<torrent> t = m_torrent.lock(); boost::shared_ptr<torrent> t = m_torrent.lock();
if (!t) return; if (!t) return;
@ -3997,7 +4006,9 @@ namespace libtorrent
void peer_connection::keep_alive() void peer_connection::keep_alive()
{ {
#ifdef TORRENT_EXPENSIVE_INVARIANT_CHECKS
INVARIANT_CHECK; INVARIANT_CHECK;
#endif
time_duration d; time_duration d;
d = time_now() - m_last_sent; d = time_now() - m_last_sent;

View File

@ -122,7 +122,9 @@ namespace libtorrent
void piece_picker::piece_info(int index, piece_picker::downloading_piece& st) const void piece_picker::piece_info(int index, piece_picker::downloading_piece& st) const
{ {
#ifdef TORRENT_EXPENSIVE_INVARIANT_CHECKS
TORRENT_PIECE_PICKER_INVARIANT_CHECK; TORRENT_PIECE_PICKER_INVARIANT_CHECK;
#endif
TORRENT_ASSERT(index >= 0); TORRENT_ASSERT(index >= 0);
TORRENT_ASSERT(index < int(m_piece_map.size())); TORRENT_ASSERT(index < int(m_piece_map.size()));
@ -1312,7 +1314,9 @@ namespace libtorrent
// only one of rarest_first and sequential can be set. // only one of rarest_first and sequential can be set.
TORRENT_ASSERT(bool(options & rarest_first) TORRENT_ASSERT(bool(options & rarest_first)
+ bool(options & sequential) <= 1); + bool(options & sequential) <= 1);
#ifdef TORRENT_EXPENSIVE_INVARIANT_CHECKS
TORRENT_PIECE_PICKER_INVARIANT_CHECK; TORRENT_PIECE_PICKER_INVARIANT_CHECK;
#endif
TORRENT_ASSERT(num_blocks > 0); TORRENT_ASSERT(num_blocks > 0);
TORRENT_ASSERT(pieces.size() == m_piece_map.size()); TORRENT_ASSERT(pieces.size() == m_piece_map.size());
@ -2173,7 +2177,9 @@ namespace libtorrent
// a peer disconnects. The piece might be in any state // a peer disconnects. The piece might be in any state
void piece_picker::abort_download(piece_block block) void piece_picker::abort_download(piece_block block)
{ {
#ifdef TORRENT_EXPENSIVE_INVARIANT_CHECKS
TORRENT_PIECE_PICKER_INVARIANT_CHECK; TORRENT_PIECE_PICKER_INVARIANT_CHECK;
#endif
TORRENT_ASSERT(block.piece_index >= 0); TORRENT_ASSERT(block.piece_index >= 0);
TORRENT_ASSERT(block.block_index >= 0); TORRENT_ASSERT(block.block_index >= 0);

View File

@ -1353,19 +1353,23 @@ namespace aux {
> bind(&torrent::seed_rank, _2, boost::ref(m_settings))); > bind(&torrent::seed_rank, _2, boost::ref(m_settings)));
} }
int total_running = 0;
for (std::vector<torrent*>::iterator i = downloaders.begin() for (std::vector<torrent*>::iterator i = downloaders.begin()
, end(downloaders.end()); i != end; ++i) , end(downloaders.end()); i != end; ++i)
{ {
torrent* t = *i; torrent* t = *i;
if (!t->is_paused() && !is_active(t, settings()) && hard_limit > 0) if (!t->is_paused() && !is_active(t, settings())
&& hard_limit > 0 && total_running < m_max_uploads)
{ {
--hard_limit; --hard_limit;
++total_running;
continue; continue;
} }
if (num_downloaders > 0 && hard_limit > 0) if (num_downloaders > 0 && hard_limit > 0)
{ {
--hard_limit; --hard_limit;
++total_running;
if (t->state() != torrent_status::queued_for_checking if (t->state() != torrent_status::queued_for_checking
&& t->state() != torrent_status::checking_files) && t->state() != torrent_status::checking_files)
{ {
@ -1383,9 +1387,11 @@ namespace aux {
, end(seeds.end()); i != end; ++i) , end(seeds.end()); i != end; ++i)
{ {
torrent* t = *i; torrent* t = *i;
if (!t->is_paused() && !is_active(t, settings()) && hard_limit > 0) if (!t->is_paused() && !is_active(t, settings())
&& hard_limit > 0 && total_running < m_max_uploads)
{ {
--hard_limit; --hard_limit;
++total_running;
continue; continue;
} }
@ -1393,6 +1399,7 @@ namespace aux {
{ {
--hard_limit; --hard_limit;
--num_seeds; --num_seeds;
++total_running;
if (t->is_paused()) t->resume(); if (t->is_paused()) t->resume();
} }
else else
@ -1410,6 +1417,7 @@ namespace aux {
, end(m_connections.end()); i != end; ++i) , end(m_connections.end()); i != end; ++i)
{ {
peer_connection* p = i->get(); peer_connection* p = i->get();
TORRENT_ASSERT(p);
torrent* t = p->associated_torrent().lock().get(); torrent* t = p->associated_torrent().lock().get();
if (!p->peer_info_struct() if (!p->peer_info_struct()
|| t == 0 || t == 0
@ -1455,7 +1463,8 @@ namespace aux {
// limit // limit
if (m_stat.upload_rate() < upload_limit * 0.9f if (m_stat.upload_rate() < upload_limit * 0.9f
&& m_allowed_upload_slots <= m_num_unchoked + 1 && m_allowed_upload_slots <= m_num_unchoked + 1
&& congested_torrents < uncongested_torrents) && congested_torrents < uncongested_torrents
&& m_upload_channel.queue_size() < 2)
{ {
++m_allowed_upload_slots; ++m_allowed_upload_slots;
} }
@ -1494,6 +1503,8 @@ namespace aux {
if (p->peer_info_struct()->optimistically_unchoked) if (p->peer_info_struct()->optimistically_unchoked)
{ {
// force a new optimistic unchoke // force a new optimistic unchoke
// since this one just got promoted into the
// proper unchoke set
m_optimistic_unchoke_time_scaler = 0; m_optimistic_unchoke_time_scaler = 0;
p->peer_info_struct()->optimistically_unchoked = false; p->peer_info_struct()->optimistically_unchoked = false;
} }

View File

@ -523,7 +523,8 @@ namespace libtorrent
// the directory exists. // the directory exists.
if (file_iter->size == 0) if (file_iter->size == 0)
{ {
file(m_save_path / file_iter->path, file::out, ec); boost::shared_ptr<file> f = m_pool.open_file(this
, m_save_path / file_iter->path, file::in | file::out, ec);
if (ec) if (ec)
{ {
set_error(m_save_path / file_iter->path, ec); set_error(m_save_path / file_iter->path, ec);

View File

@ -2069,7 +2069,15 @@ namespace libtorrent
} }
if (!p->is_choked()) if (!p->is_choked())
{
--m_num_uploads; --m_num_uploads;
m_ses.m_unchoke_time_scaler = 0;
}
if (p->peer_info_struct() && p->peer_info_struct()->optimistically_unchoked)
{
m_ses.m_optimistic_unchoke_time_scaler = 0;
}
m_policy.connection_closed(*p); m_policy.connection_closed(*p);
p->set_peer_info(0); p->set_peer_info(0);

View File

@ -141,7 +141,7 @@ void upnp::discover_device_impl()
} }
++m_retry_count; ++m_retry_count;
m_broadcast_timer.expires_from_now(milliseconds(250 * m_retry_count), ec); m_broadcast_timer.expires_from_now(seconds(2 * m_retry_count), ec);
m_broadcast_timer.async_wait(bind(&upnp::resend_request m_broadcast_timer.async_wait(bind(&upnp::resend_request
, self(), _1)); , self(), _1));
@ -240,7 +240,7 @@ void upnp::resend_request(error_code const& e)
mutex_t::scoped_lock l(m_mutex); mutex_t::scoped_lock l(m_mutex);
if (m_retry_count < 9 if (m_retry_count < 12
&& (m_devices.empty() || m_retry_count < 4)) && (m_devices.empty() || m_retry_count < 4))
{ {
discover_device_impl(); discover_device_impl();
@ -251,7 +251,7 @@ void upnp::resend_request(error_code const& e)
{ {
#ifdef TORRENT_UPNP_LOGGING #ifdef TORRENT_UPNP_LOGGING
m_log << time_now_string() m_log << time_now_string()
<< " *** Got no response in 9 retries. Giving up, " << " *** Got no response in 12 retries. Giving up, "
"disabling UPnP." << std::endl; "disabling UPnP." << std::endl;
#endif #endif
disable("no UPnP router found"); disable("no UPnP router found");
@ -560,7 +560,7 @@ void upnp::post(upnp::rootdevice const& d, std::string const& soap
std::stringstream header; std::stringstream header;
header << "POST " << d.control_url << " HTTP/1.1\r\n" header << "POST " << d.path << " HTTP/1.0\r\n"
"Host: " << d.hostname << ":" << d.port << "\r\n" "Host: " << d.hostname << ":" << d.port << "\r\n"
"Content-Type: text/xml; charset=\"utf-8\"\r\n" "Content-Type: text/xml; charset=\"utf-8\"\r\n"
"Content-Length: " << soap.size() << "\r\n" "Content-Length: " << soap.size() << "\r\n"
@ -876,6 +876,22 @@ void upnp::on_upnp_xml(error_code const& e
d.control_url = s.control_url; d.control_url = s.control_url;
std::string protocol;
std::string auth;
char const* error;
boost::tie(protocol, auth, d.hostname, d.port, d.path, error)
= parse_url_components(d.control_url);
if (error)
{
#ifdef TORRENT_UPNP_LOGGING
m_log << time_now_string()
<< " *** Failed to parse URL '" << d.control_url << "': " << error << std::endl;
#endif
d.disabled = true;
return;
}
if (num_mappings() > 0) update_map(d, 0); if (num_mappings() > 0) update_map(d, 0);
} }