forked from premiere/premiere-libtorrent
fixed runtime-check that msvc adds if that option is checked. Fixed problem that occured if the max_transactions limit was reached.
This commit is contained in:
parent
e340485974
commit
2d83cdfa59
|
@ -42,6 +42,7 @@ POSSIBILITY OF SUCH DAMAGE.
|
|||
|
||||
namespace libtorrent { namespace dht
|
||||
{
|
||||
|
||||
#ifdef TORRENT_DHT_VERBOSE_LOGGING
|
||||
TORRENT_DECLARE_LOG(refresh);
|
||||
#endif
|
||||
|
|
|
@ -161,7 +161,7 @@ public:
|
|||
|
||||
private:
|
||||
|
||||
enum { max_transactions = 1024 };
|
||||
enum { max_transactions = 2048 };
|
||||
unsigned int new_transaction_id();
|
||||
void update_oldest_transaction_id();
|
||||
|
||||
|
@ -185,8 +185,6 @@ private:
|
|||
routing_table& m_table;
|
||||
boost::posix_time::ptime m_timer;
|
||||
node_id m_random_number;
|
||||
// a cache of connection ids
|
||||
std::map<udp::endpoint, boost::uint32_t> m_connection_id;
|
||||
};
|
||||
|
||||
} } // namespace libtorrent::dht
|
||||
|
|
|
@ -59,9 +59,16 @@ using boost::posix_time::time_duration;
|
|||
namespace libtorrent { namespace dht
|
||||
{
|
||||
|
||||
#ifdef _MSC_VER
|
||||
namespace
|
||||
{
|
||||
char rand() { return (char)std::rand(); }
|
||||
}
|
||||
#endif
|
||||
|
||||
typedef boost::shared_ptr<observer> observer_ptr;
|
||||
|
||||
// TODO: configurable
|
||||
// TODO: configurable?
|
||||
enum { announce_interval = 30 };
|
||||
|
||||
using asio::ip::udp;
|
||||
|
@ -74,7 +81,11 @@ node_id generate_id()
|
|||
{
|
||||
char random[20];
|
||||
std::srand(std::time(0));
|
||||
#ifdef _MSC_VER
|
||||
std::generate(random, random + 20, &rand);
|
||||
#else
|
||||
std::generate(random, random + 20, &std::rand);
|
||||
#endif
|
||||
|
||||
hasher h;
|
||||
h.update(random, 20);
|
||||
|
|
|
@ -46,7 +46,9 @@ namespace libtorrent { namespace dht
|
|||
|
||||
using asio::ip::udp;
|
||||
|
||||
#ifdef TORRENT_DHT_VERBOSE_LOGGING
|
||||
TORRENT_DEFINE_LOG(refresh)
|
||||
#endif
|
||||
|
||||
typedef boost::shared_ptr<observer> observer_ptr;
|
||||
|
||||
|
@ -125,11 +127,11 @@ void ping_observer::timeout()
|
|||
m_algorithm->ping_timeout(m_self);
|
||||
}
|
||||
|
||||
void refresh::invoke(node_id const& id, udp::endpoint addr)
|
||||
void refresh::invoke(node_id const& nid, udp::endpoint addr)
|
||||
{
|
||||
observer_ptr p(new refresh_observer(
|
||||
this
|
||||
, id
|
||||
, nid
|
||||
, m_target
|
||||
));
|
||||
|
||||
|
@ -144,13 +146,13 @@ void refresh::done()
|
|||
invoke_pings_or_finish();
|
||||
}
|
||||
|
||||
void refresh::ping_reply(node_id id)
|
||||
void refresh::ping_reply(node_id nid)
|
||||
{
|
||||
m_active_pings--;
|
||||
invoke_pings_or_finish();
|
||||
}
|
||||
|
||||
void refresh::ping_timeout(node_id id)
|
||||
void refresh::ping_timeout(node_id nid)
|
||||
{
|
||||
m_active_pings--;
|
||||
invoke_pings_or_finish();
|
||||
|
|
|
@ -32,6 +32,7 @@ POSSIBILITY OF SUCH DAMAGE.
|
|||
|
||||
#include <boost/date_time/posix_time/posix_time_types.hpp>
|
||||
#include <boost/date_time/posix_time/ptime.hpp>
|
||||
#include <boost/bind.hpp>
|
||||
|
||||
#include <libtorrent/io.hpp>
|
||||
#include <libtorrent/invariant_check.hpp>
|
||||
|
@ -48,6 +49,7 @@ using boost::posix_time::microsec_clock;
|
|||
using boost::posix_time::seconds;
|
||||
using boost::posix_time::milliseconds;
|
||||
using boost::shared_ptr;
|
||||
using boost::bind;
|
||||
|
||||
namespace libtorrent { namespace dht
|
||||
{
|
||||
|
@ -88,9 +90,10 @@ void rpc_manager::check_invariant() const
|
|||
assert(m_oldest_transaction_id < max_transactions);
|
||||
assert(m_next_transaction_id >= 0);
|
||||
assert(m_next_transaction_id < max_transactions);
|
||||
assert(!m_transactions[m_next_transaction_id]);
|
||||
|
||||
for (int i = m_next_transaction_id; i != m_oldest_transaction_id;
|
||||
i = (i + 1) % max_transactions)
|
||||
for (int i = (m_next_transaction_id + 1) % max_transactions;
|
||||
i != m_oldest_transaction_id; i = (i + 1) % max_transactions)
|
||||
{
|
||||
assert(!m_transactions[i]);
|
||||
}
|
||||
|
@ -198,7 +201,7 @@ time_duration rpc_manager::tick()
|
|||
assert(m_oldest_transaction_id >= 0);
|
||||
assert(m_oldest_transaction_id < max_transactions);
|
||||
|
||||
boost::shared_ptr<observer>& o = m_transactions[m_oldest_transaction_id];
|
||||
boost::shared_ptr<observer> o = m_transactions[m_oldest_transaction_id];
|
||||
if (!o) continue;
|
||||
|
||||
time_duration diff = o->sent + milliseconds(timeout_ms)
|
||||
|
@ -209,8 +212,8 @@ time_duration rpc_manager::tick()
|
|||
return diff;
|
||||
}
|
||||
|
||||
m_transactions[m_oldest_transaction_id].reset();
|
||||
o->timeout();
|
||||
o.reset();
|
||||
}
|
||||
return milliseconds(timeout_ms);
|
||||
}
|
||||
|
@ -221,16 +224,19 @@ unsigned int rpc_manager::new_transaction_id()
|
|||
|
||||
unsigned int tid = m_next_transaction_id;
|
||||
m_next_transaction_id = (m_next_transaction_id + 1) % max_transactions;
|
||||
assert(!m_transactions[tid]);
|
||||
// boost::shared_ptr<observer> o = m_transactions[m_next_transaction_id];
|
||||
if (m_transactions[m_next_transaction_id])
|
||||
{
|
||||
m_transactions[m_next_transaction_id]->timeout();
|
||||
m_transactions[m_next_transaction_id].reset();
|
||||
assert(m_oldest_transaction_id == m_next_transaction_id);
|
||||
}
|
||||
if (m_oldest_transaction_id == m_next_transaction_id)
|
||||
{
|
||||
m_oldest_transaction_id = (m_oldest_transaction_id + 1) % max_transactions;
|
||||
#ifdef TORRENT_DHT_VERBOSE_LOGGING
|
||||
TORRENT_LOG(rpc) << "WARNING: transaction limit reached! Too many concurrent"
|
||||
" messages! limit: " << (int)max_transactions;
|
||||
#endif
|
||||
update_oldest_transaction_id();
|
||||
}
|
||||
|
||||
|
@ -243,6 +249,12 @@ unsigned int rpc_manager::new_transaction_id()
|
|||
}
|
||||
#endif
|
||||
|
||||
// hopefully this wouldn't happen, but unfortunately, the
|
||||
// traversal algorithm will simply fail in case its connections
|
||||
// are overwritten. If timeout() is called, it will likely spawn
|
||||
// another connection, which in turn will close the next one
|
||||
// and so on.
|
||||
// if (o) o->timeout();
|
||||
return tid;
|
||||
}
|
||||
|
||||
|
@ -250,6 +262,7 @@ void rpc_manager::update_oldest_transaction_id()
|
|||
{
|
||||
INVARIANT_CHECK;
|
||||
|
||||
assert(m_oldest_transaction_id != m_next_transaction_id);
|
||||
while (!m_transactions[m_oldest_transaction_id])
|
||||
{
|
||||
m_oldest_transaction_id = (m_oldest_transaction_id + 1)
|
||||
|
|
|
@ -79,7 +79,7 @@ void traversal_algorithm::traverse(node_id const& id, udp::endpoint addr)
|
|||
|
||||
void traversal_algorithm::finished(node_id const& id)
|
||||
{
|
||||
m_invoke_count--;
|
||||
--m_invoke_count;
|
||||
add_requests();
|
||||
if (m_invoke_count == 0) done();
|
||||
}
|
||||
|
@ -114,7 +114,7 @@ void traversal_algorithm::failed(node_id const& id)
|
|||
void traversal_algorithm::add_request(node_id const& id, udp::endpoint addr)
|
||||
{
|
||||
invoke(id, addr);
|
||||
m_invoke_count++;
|
||||
++m_invoke_count;
|
||||
}
|
||||
|
||||
namespace
|
||||
|
|
Loading…
Reference in New Issue