diff --git a/src/peer_connection.cpp b/src/peer_connection.cpp
index 59031cc18..25bc0ba63 100755
--- a/src/peer_connection.cpp
+++ b/src/peer_connection.cpp
@@ -1952,7 +1952,6 @@ namespace libtorrent
}
t->remove_peer(this);
-
m_torrent.reset();
}
@@ -2856,6 +2855,8 @@ namespace libtorrent
return;
}
+ assert(t->connection_for(remote()) != 0 || m_in_constructor);
+
if (!m_in_constructor && t->connection_for(remote()) != this
&& !m_ses.settings().allow_multiple_connections_per_ip)
{
diff --git a/src/policy.cpp b/src/policy.cpp
index 6e81da0d5..f8fb1d28b 100755
--- a/src/policy.cpp
+++ b/src/policy.cpp
@@ -138,28 +138,28 @@ namespace
return free_upload;
}
- struct match_peer_ip
+ struct match_peer_address
{
- match_peer_ip(address const& ip)
- : m_ip(ip)
+ match_peer_address(address const& addr)
+ : m_addr(addr)
{}
bool operator()(policy::peer const& p) const
- { return p.ip.address() == m_ip; }
+ { return p.ip.address() == m_addr; }
- address const& m_ip;
+ address const& m_addr;
};
- struct match_peer_id
+ struct match_peer_endpoint
{
- match_peer_id(peer_id const& id_)
- : m_id(id_)
+ match_peer_endpoint(tcp::endpoint const& ep)
+ : m_ep(ep)
{}
bool operator()(policy::peer const& p) const
- { return p.connection && p.connection->pid() == m_id; }
+ { return p.ip == m_ep; }
- peer_id const& m_id;
+ tcp::endpoint const& m_ep;
};
struct match_peer_connection
@@ -939,7 +939,7 @@ namespace libtorrent
i = std::find_if(
m_peers.begin()
, m_peers.end()
- , match_peer_ip(c.remote().address()));
+ , match_peer_address(c.remote().address()));
}
if (i != m_peers.end())
@@ -1029,14 +1029,14 @@ namespace libtorrent
i = std::find_if(
m_peers.begin()
, m_peers.end()
- , match_peer_id(pid));
+ , match_peer_endpoint(remote));
}
else
{
i = std::find_if(
m_peers.begin()
, m_peers.end()
- , match_peer_ip(remote.address()));
+ , match_peer_address(remote.address()));
}
if (i == m_peers.end())
@@ -1291,9 +1291,15 @@ namespace libtorrent
try
{
+ INVARIANT_CHECK;
p->connected = time_now();
p->connection = m_torrent->connect_to_peer(&*p);
- if (p->connection == 0) return false;
+ assert(p->connection == m_torrent->connection_for(p->ip));
+ if (p->connection == 0)
+ {
+ ++p->failcount;
+ return false;
+ }
p->connection->add_stat(p->prev_amount_download, p->prev_amount_upload);
p->prev_amount_download = 0;
p->prev_amount_upload = 0;
@@ -1305,6 +1311,7 @@ namespace libtorrent
(*m_torrent->session().m_logger) << "*** CONNECTION FAILED '"
<< e.what() << "'\n";
#endif
+ std::cerr << e.what() << std::endl;
++p->failcount;
return false;
}
@@ -1402,15 +1409,22 @@ namespace libtorrent
int nonempty_connections = 0;
std::set
unique_test;
+ std::set unique_test2;
for (const_iterator i = m_peers.begin();
i != m_peers.end(); ++i)
{
peer const& p = *i;
if (!m_torrent->settings().allow_multiple_connections_per_ip)
assert(unique_test.find(p.ip.address()) == unique_test.end());
+ assert(unique_test2.find(p.ip) == unique_test2.end());
unique_test.insert(p.ip.address());
+ unique_test2.insert(p.ip);
++total_connections;
- if (!p.connection) continue;
+ if (!p.connection)
+ {
+ assert(m_torrent->connection_for(p.ip) == 0);
+ continue;
+ }
if (!m_torrent->settings().allow_multiple_connections_per_ip)
{
std::vector conns;
diff --git a/src/torrent.cpp b/src/torrent.cpp
index ddf8a9164..252461bc6 100755
--- a/src/torrent.cpp
+++ b/src/torrent.cpp
@@ -1653,6 +1653,7 @@ namespace libtorrent
assert(m_connections.find(a) == m_connections.end());
// add the newly connected peer to this torrent's peer list
+ assert(m_connections.find(a) == m_connections.end());
m_connections.insert(
std::make_pair(a, boost::get_pointer(c)));
m_ses.m_connections.insert(std::make_pair(s, c));
@@ -1669,8 +1670,8 @@ namespace libtorrent
#endif
// TODO: post an error alert!
- std::map::iterator i = m_connections.find(a);
- if (i != m_connections.end()) m_connections.erase(i);
+// std::map::iterator i = m_connections.find(a);
+// if (i != m_connections.end()) m_connections.erase(i);
m_ses.connection_failed(s, a, e.what());
c->disconnect();
}
@@ -1857,6 +1858,8 @@ namespace libtorrent
try
{
+ assert(m_connections.find(a) == m_connections.end());
+
// add the newly connected peer to this torrent's peer list
m_connections.insert(
std::make_pair(a, boost::get_pointer(c)));
@@ -1869,6 +1872,7 @@ namespace libtorrent
}
catch (std::exception& e)
{
+ assert(false);
// TODO: post an error alert!
std::map::iterator i = m_connections.find(a);
if (i != m_connections.end()) m_connections.erase(i);
@@ -1925,6 +1929,7 @@ namespace libtorrent
= m_connections.find(p->remote());
if (c != m_connections.end())
{
+ assert(p != c->second);
// we already have a peer_connection to this ip.
// It may currently be waiting for completing a
// connection attempt that might fail. So,
@@ -1948,6 +1953,7 @@ namespace libtorrent
throw protocol_error("session is closing");
}
+ assert(m_connections.find(p->remote()) == m_connections.end());
peer_iterator ci = m_connections.insert(
std::make_pair(p->remote(), p)).first;
try
@@ -2408,6 +2414,12 @@ namespace libtorrent
assert(m_abort || m_have_pieces.empty());
}
+/* for (policy::const_iterator i = m_policy->begin_peer()
+ , end(m_policy->end_peer()); i != end; ++i)
+ {
+ assert(i->connection == const_cast(this)->connection_for(i->ip));
+ }
+*/
size_type total_done = quantized_bytes_done();
if (m_torrent_file->is_valid())
{