*** empty log message ***

This commit is contained in:
Magnus Jonsson 2004-03-11 14:56:48 +00:00
parent 8e581e7a37
commit d6dc5b52e4
6 changed files with 163 additions and 105 deletions

View File

@ -39,6 +39,7 @@ POSSIBILITY OF SUCH DAMAGE.
namespace libtorrent namespace libtorrent
{ {
struct resource_request { struct resource_request {
resource_request() : used(0), wanted(0), given(0) { } resource_request() : used(0), wanted(0), given(0) { }
// I'm right now actively using: // I'm right now actively using:

View File

@ -131,11 +131,7 @@ namespace libtorrent
// this adds an announcement in the announcement queue // this adds an announcement in the announcement queue
// it will let the peer know that we have the given piece // it will let the peer know that we have the given piece
void announce_piece(int index) void announce_piece(int index);
{
assert(index >= 0 && index < m_torrent->torrent_file().num_pieces());
m_announce_queue.push_back(index);
}
// called from the main loop when this connection has any // called from the main loop when this connection has any
// work to do. // work to do.
@ -153,17 +149,10 @@ namespace libtorrent
void keep_alive(); void keep_alive();
const peer_id& id() const { return m_peer_id; } const peer_id& id() const { return m_peer_id; }
bool has_piece(int i) const bool has_piece(int i) const;
{
assert(i >= 0);
assert(i < m_torrent->torrent_file().num_pieces());
return m_have_piece[i];
}
const std::deque<piece_block>& download_queue() const const std::deque<piece_block>& download_queue() const;
{ return m_download_queue; } const std::deque<peer_request>& upload_queue() const;
const std::deque<peer_request>& upload_queue() const
{ return m_requests; }
// returns the block currently being // returns the block currently being
// downloaded. And the progress of that // downloaded. And the progress of that
@ -187,8 +176,7 @@ namespace libtorrent
bool verify_piece(const peer_request& p) const; bool verify_piece(const peer_request& p) const;
const stat& statistics() const { return m_statistics; } const stat& statistics() const { return m_statistics; }
void add_stat(size_type downloaded, size_type uploaded) void add_stat(size_type downloaded, size_type uploaded);
{ m_statistics.add_stat(downloaded, uploaded); }
// is called once every second by the main loop // is called once every second by the main loop
void second_tick(); void second_tick();
@ -196,63 +184,42 @@ namespace libtorrent
boost::shared_ptr<libtorrent::socket> get_socket() const { return m_socket; } boost::shared_ptr<libtorrent::socket> get_socket() const { return m_socket; }
const peer_id& get_peer_id() const { return m_peer_id; } const peer_id& get_peer_id() const { return m_peer_id; }
const std::vector<bool>& get_bitfield() const const std::vector<bool>& get_bitfield() const;
{ return m_have_piece; }
// this will cause this peer_connection to be disconnected. // this will cause this peer_connection to be disconnected.
// what it does is that it puts a reference to it in // what it does is that it puts a reference to it in
// m_ses.m_disconnect_peer list, which will be scanned in the // m_ses.m_disconnect_peer list, which will be scanned in the
// mainloop to disconnect peers. // mainloop to disconnect peers.
void disconnect(); void disconnect();
bool is_disconnecting() const { return m_disconnecting; }
bool is_disconnecting() const
{ return m_disconnecting; }
resource_request upload_bandwidth;
// returns the send quota this peer has // returns the send quota this peer has
// left until will stop sending. // left until will stop sending.
// if the send_quota is -1, it means the // if the send_quota is -1, it means the
// quota is unlimited. // quota is unlimited.
int send_quota_left() const { return upload_bandwidth.given-upload_bandwidth.used; } int send_quota_left() const;
resource_request* upload_bandwidth_quota();
void update_send_quota_left() // ?? TODO: document
{ void update_send_quota_left();
upload_bandwidth.used=0;
send_buffer_updated();
}
size_type total_free_upload() const // free upload.
{ return m_free_upload; } size_type total_free_upload() const;
void add_free_upload(size_type free_upload);
void add_free_upload(size_type free_upload)
{ m_free_upload += free_upload; }
void received_valid_data() // trust management.
{ void received_valid_data();
m_trust_points++; void received_invalid_data();
if (m_trust_points > 20) m_trust_points = 20; int trust_points() const;
}
void received_invalid_data()
{
m_trust_points--;
if (m_trust_points < -5) m_trust_points = -5;
}
int trust_points() const
{ return m_trust_points; }
size_type share_diff() const; size_type share_diff() const;
bool support_extensions() const bool support_extensions() const { return m_supports_extensions; }
{ return m_supports_extensions; }
// a connection is local if it was initiated by us. // a connection is local if it was initiated by us.
// if it was an incoming connection, it is remote // if it was an incoming connection, it is remote
bool is_local() const bool is_local() const { return m_active; }
{ return m_active; }
#ifndef NDEBUG #ifndef NDEBUG
boost::shared_ptr<logger> m_logger; boost::shared_ptr<logger> m_logger;
@ -300,6 +267,11 @@ namespace libtorrent
void check_invariant() const; void check_invariant() const;
bool dispatch_message(int received); bool dispatch_message(int received);
// this is called each time this peer generates some
// data to be sent. It will add this socket to
// the writibility monitor in the selector.
void send_buffer_updated(); void send_buffer_updated();
// is used during handshake // is used during handshake
@ -379,6 +351,14 @@ namespace libtorrent
selector& m_selector; selector& m_selector;
boost::shared_ptr<libtorrent::socket> m_socket; boost::shared_ptr<libtorrent::socket> m_socket;
// how much bandwidth we're using, how much we want,
// and how much we are allowed to use.
resource_request m_upload_bandwidth_quota;
// upload bandwidth used this second.
// Must not exceed m_upload_bandwidth_quota.given.
int m_upload_bandwidth_quota_used;
// this is the torrent this connection is // this is the torrent this connection is
// associated with. If the connection is an // associated with. If the connection is an
// incoming conncetion, this is set to zero // incoming conncetion, this is set to zero
@ -508,33 +488,6 @@ namespace libtorrent
// this peer the last time. // this peer the last time.
boost::posix_time::ptime m_became_uninteresting; boost::posix_time::ptime m_became_uninteresting;
}; };
// this is called each time this peer generates some
// data to be sent. It will add this socket to
// the writibility monitor in the selector.
inline void peer_connection::send_buffer_updated()
{
if (!has_data())
{
if (m_added_to_selector)
{
m_selector.remove_writable(m_socket);
m_added_to_selector = false;
}
assert(!m_selector.is_writability_monitored(m_socket));
return;
}
assert(upload_bandwidth.used < upload_bandwidth.given);
assert(has_data());
if (!m_added_to_selector)
{
m_selector.monitor_writability(m_socket);
m_added_to_selector = true;
}
assert(m_added_to_selector);
assert(m_selector.is_writability_monitored(m_socket));
}
} }
#endif // TORRENT_PEER_CONNECTION_HPP_INCLUDED #endif // TORRENT_PEER_CONNECTION_HPP_INCLUDED

View File

@ -153,12 +153,11 @@ namespace libtorrent
#endif #endif
} // namespace unnamed } // namespace unnamed
void allocate_resources(int resources void allocate_resources(int resources,
, std::vector<resource_request *>& requests) std::vector<resource_request *>& requests)
{ {
#ifndef NDEBUG #ifndef NDEBUG
allocate_resources_contract_check allocate_resources_contract_check contract_check(resources,requests);
contract_check(resources,requests);
#endif #endif
if(resources == std::numeric_limits<int>::max()) if(resources == std::numeric_limits<int>::max())

View File

@ -106,6 +106,7 @@ namespace libtorrent
, m_disconnecting(false) , m_disconnecting(false)
, m_became_uninterested(boost::posix_time::second_clock::local_time()) , m_became_uninterested(boost::posix_time::second_clock::local_time())
, m_became_uninteresting(boost::posix_time::second_clock::local_time()) , m_became_uninteresting(boost::posix_time::second_clock::local_time())
, m_upload_bandwidth_quota_used(0)
{ {
INVARIANT_CHECK; INVARIANT_CHECK;
@ -167,6 +168,7 @@ namespace libtorrent
, m_disconnecting(false) , m_disconnecting(false)
, m_became_uninterested(boost::posix_time::second_clock::local_time()) , m_became_uninterested(boost::posix_time::second_clock::local_time())
, m_became_uninteresting(boost::posix_time::second_clock::local_time()) , m_became_uninteresting(boost::posix_time::second_clock::local_time())
, m_upload_bandwidth_quota_used(0)
{ {
INVARIANT_CHECK; INVARIANT_CHECK;
@ -202,6 +204,85 @@ namespace libtorrent
} }
} }
void peer_connection::announce_piece(int index)
{
assert(m_torrent);
assert(index >= 0 && index < m_torrent->torrent_file().num_pieces());
m_announce_queue.push_back(index);
}
bool peer_connection::has_piece(int i) const
{
assert(m_torrent);
assert(i >= 0);
assert(i < m_torrent->torrent_file().num_pieces());
return m_have_piece[i];
}
const std::deque<piece_block>& peer_connection::download_queue() const
{
return m_download_queue;
}
const std::deque<peer_request>& peer_connection::upload_queue() const
{
return m_requests;
}
void peer_connection::add_stat(size_type downloaded, size_type uploaded)
{
m_statistics.add_stat(downloaded, uploaded);
}
const std::vector<bool>& peer_connection::get_bitfield() const
{
return m_have_piece;
}
void peer_connection::received_valid_data()
{
m_trust_points++;
if (m_trust_points > 20) m_trust_points = 20;
}
void peer_connection::received_invalid_data()
{
m_trust_points--;
if (m_trust_points < -5) m_trust_points = -5;
}
int peer_connection::trust_points() const
{
return m_trust_points;
}
size_type peer_connection::total_free_upload() const
{
return m_free_upload;
}
void peer_connection::add_free_upload(size_type free_upload)
{
m_free_upload += free_upload;
}
int peer_connection::send_quota_left() const
{
return m_upload_bandwidth_quota.given - m_upload_bandwidth_quota_used;
}
void peer_connection::update_send_quota_left()
{
m_upload_bandwidth_quota_used=0;
send_buffer_updated();
}
resource_request* peer_connection::upload_bandwidth_quota()
{
return &m_upload_bandwidth_quota;
}
void peer_connection::send_handshake() void peer_connection::send_handshake()
{ {
INVARIANT_CHECK; INVARIANT_CHECK;
@ -1219,6 +1300,7 @@ namespace libtorrent
INVARIANT_CHECK; INVARIANT_CHECK;
m_statistics.second_tick(); m_statistics.second_tick();
m_upload_bandwidth_quota.used=(int)ceil(statistics().upload_rate());
// update_send_quota_left(); // update_send_quota_left();
@ -1235,9 +1317,9 @@ namespace libtorrent
// than we have uploaded OR if we are a seed // than we have uploaded OR if we are a seed
// have an unlimited upload rate // have an unlimited upload rate
if(!m_send_buffer.empty() || (!m_requests.empty() && !is_choked())) if(!m_send_buffer.empty() || (!m_requests.empty() && !is_choked()))
upload_bandwidth.wanted = std::numeric_limits<int>::max(); m_upload_bandwidth_quota.wanted = std::numeric_limits<int>::max();
else else
upload_bandwidth.wanted = 1; m_upload_bandwidth_quota.wanted = 1;
} }
else else
{ {
@ -1262,7 +1344,7 @@ namespace libtorrent
upload_speed_limit=std::min(upload_speed_limit, upload_speed_limit=std::min(upload_speed_limit,
(double)std::numeric_limits<int>::max()); (double)std::numeric_limits<int>::max());
upload_bandwidth.wanted = (int) upload_speed_limit; m_upload_bandwidth_quota.wanted = (int) upload_speed_limit;
} }
/* /*
@ -1277,7 +1359,7 @@ namespace libtorrent
// if we have downloaded more than one piece more // if we have downloaded more than one piece more
// than we have uploaded OR if we are a seed // than we have uploaded OR if we are a seed
// have an unlimited upload rate // have an unlimited upload rate
upload_bandwidth.wanted = std::numeric_limits<int>::max(); m_upload_bandwidth_quota.wanted = std::numeric_limits<int>::max();
} }
else else
{ {
@ -1296,10 +1378,10 @@ namespace libtorrent
{ {
bias = -static_cast<int>(m_statistics.download_rate() * ratio) / 2; bias = -static_cast<int>(m_statistics.download_rate() * ratio) / 2;
} }
upload_bandwidth.wanted = static_cast<int>(m_statistics.download_rate()) + bias; m_upload_bandwidth_quota.wanted = static_cast<int>(m_statistics.download_rate()) + bias;
// the maximum send_quota given our download rate from this peer // the maximum send_quota given our download rate from this peer
if (upload_bandwidth.wanted < 256) upload_bandwidth.wanted = 256; if (m_upload_bandwidth_quota.wanted < 256) m_upload_bandwidth_quota.wanted = 256;
} }
*/ */
} }
@ -1576,7 +1658,7 @@ namespace libtorrent
// we want to send data // we want to send data
return ((!m_requests.empty() && !m_choked) return ((!m_requests.empty() && !m_choked)
|| !m_send_buffer.empty()) || !m_send_buffer.empty())
&& upload_bandwidth.used < upload_bandwidth.given; && send_quota_left()>0;
} }
// -------------------------- // --------------------------
@ -1655,15 +1737,15 @@ namespace libtorrent
m_announce_queue.clear(); m_announce_queue.clear();
} }
assert(upload_bandwidth.used < upload_bandwidth.given); assert(m_upload_bandwidth_quota_used < m_upload_bandwidth_quota.given);
// send the actual buffer // send the actual buffer
if (!m_send_buffer.empty()) if (!m_send_buffer.empty())
{ {
int amount_to_send = (int)m_send_buffer.size(); int amount_to_send = (int)m_send_buffer.size();
assert(upload_bandwidth.used < upload_bandwidth.given); amount_to_send = std::min(send_quota_left(), amount_to_send);
amount_to_send = std::min(upload_bandwidth.given-upload_bandwidth.used, amount_to_send); assert(amount_to_send>0);
// we have data that's scheduled for sending // we have data that's scheduled for sending
int sent = m_socket->send( int sent = m_socket->send(
@ -1672,7 +1754,7 @@ namespace libtorrent
if (sent > 0) if (sent > 0)
{ {
upload_bandwidth.used += sent; m_upload_bandwidth_quota_used += sent;
// manage the payload markers // manage the payload markers
int amount_payload = 0; int amount_payload = 0;
@ -1809,4 +1891,29 @@ namespace libtorrent
{ {
return m_num_pieces == (int)m_have_piece.size(); return m_num_pieces == (int)m_have_piece.size();
} }
void peer_connection::send_buffer_updated()
{
if (!has_data())
{
if (m_added_to_selector)
{
m_selector.remove_writable(m_socket);
m_added_to_selector = false;
}
assert(!m_selector.is_writability_monitored(m_socket));
return;
}
assert(send_quota_left()>0);
assert(has_data());
if (!m_added_to_selector)
{
m_selector.monitor_writability(m_socket);
m_added_to_selector = true;
}
assert(m_added_to_selector);
assert(m_selector.is_writability_monitored(m_socket));
}
} }

View File

@ -110,9 +110,7 @@ namespace
c != connections.end(); ++c) c != connections.end(); ++c)
{ {
boost::shared_ptr<peer_connection> p = c->second; boost::shared_ptr<peer_connection> p = c->second;
p->upload_bandwidth.used = (int)ceil(p->statistics().upload_rate()); requests.push_back(p->upload_bandwidth_quota());
requests.push_back(&p->upload_bandwidth);
} }
allocate_resources(upload_limit, requests); allocate_resources(upload_limit, requests);
@ -530,7 +528,7 @@ namespace libtorrent { namespace detail
if (m_upload_rate != -1) if (m_upload_rate != -1)
{ {
c->upload_bandwidth.given = 0; c->upload_bandwidth_quota()->given = 0;
c->update_send_quota_left(); c->update_send_quota_left();
} }
@ -786,7 +784,7 @@ namespace libtorrent { namespace detail
"peer_connection::has_data() != is_writability_monitored()\n"; "peer_connection::has_data() != is_writability_monitored()\n";
error_log << "peer_connection::has_data() " << p->has_data() << "\n"; error_log << "peer_connection::has_data() " << p->has_data() << "\n";
error_log << "peer_connection::send_quota_left " << p->send_quota_left() << "\n"; error_log << "peer_connection::send_quota_left " << p->send_quota_left() << "\n";
error_log << "peer_connection::upload_bandwidth.given " << p->upload_bandwidth.given << "\n"; error_log << "peer_connection::upload_bandwidth_quota()->given " << p->upload_bandwidth_quota()->given << "\n";
error_log << "peer_connection::get_peer_id " << p->get_peer_id() << "\n"; error_log << "peer_connection::get_peer_id " << p->get_peer_id() << "\n";
error_log << "place: " << place << "\n"; error_log << "place: " << place << "\n";
error_log.flush(); error_log.flush();
@ -992,7 +990,7 @@ namespace libtorrent
= m_impl.m_connections.begin(); = m_impl.m_connections.begin();
i != m_impl.m_connections.end();) i != m_impl.m_connections.end();)
{ {
i->second->upload_bandwidth.given = std::numeric_limits<int>::max(); i->second->upload_bandwidth_quota()->given = std::numeric_limits<int>::max();
i->second->update_send_quota_left(); i->second->update_send_quota_left();
} }
} }

View File

@ -530,15 +530,15 @@ namespace libtorrent
p.total_download = statistics.total_payload_download(); p.total_download = statistics.total_payload_download();
p.total_upload = statistics.total_payload_upload(); p.total_upload = statistics.total_payload_upload();
if (peer->upload_bandwidth.given == std::numeric_limits<int>::max()) if (peer->upload_bandwidth_quota()->given == std::numeric_limits<int>::max())
p.upload_limit = -1; p.upload_limit = -1;
else else
p.upload_limit = peer->upload_bandwidth.given; p.upload_limit = peer->upload_bandwidth_quota()->given;
if (peer->upload_bandwidth.wanted == std::numeric_limits<int>::max()) if (peer->upload_bandwidth_quota()->wanted == std::numeric_limits<int>::max())
p.upload_ceiling = -1; p.upload_ceiling = -1;
else else
p.upload_ceiling = peer->upload_bandwidth.wanted; p.upload_ceiling = peer->upload_bandwidth_quota()->wanted;
p.load_balancing = peer->total_free_upload(); p.load_balancing = peer->total_free_upload();