consistency fixes related to shutting down

This commit is contained in:
Arvid Norberg 2006-12-21 22:20:28 +00:00
parent 755d9f5967
commit f83db0a423
3 changed files with 26 additions and 10 deletions

View File

@ -1001,13 +1001,11 @@ namespace libtorrent
, m_download_queue.end() , m_download_queue.end()
, block_finished); , block_finished);
std::deque<piece_block>::iterator i;
if (b != m_download_queue.end()) if (b != m_download_queue.end())
{ {
if (m_assume_fifo) if (m_assume_fifo)
{ {
for (i = m_download_queue.begin(); for (std::deque<piece_block>::iterator i = m_download_queue.begin();
i != b; ++i) i != b; ++i)
{ {
#ifdef TORRENT_VERBOSE_LOGGING #ifdef TORRENT_VERBOSE_LOGGING
@ -1115,6 +1113,23 @@ namespace libtorrent
{ {
t->piece_failed(p.piece); t->piece_failed(p.piece);
} }
#ifndef NDEBUG
if (!t->is_seed())
{
const int blocks_per_piece = static_cast<int>(
t->torrent_file().piece_length() / t->block_size());
std::vector<piece_picker::downloading_piece> const& dl_queue
= t->picker().get_download_queue();
for (std::vector<piece_picker::downloading_piece>::const_iterator i =
dl_queue.begin(); i != dl_queue.end(); ++i)
{
assert(int(i->finished_blocks.count()) < blocks_per_piece);
}
}
#endif
t->get_policy().piece_finished(p.piece, verified); t->get_policy().piece_finished(p.piece, verified);
if (!was_seed && t->is_seed()) if (!was_seed && t->is_seed())

View File

@ -971,7 +971,7 @@ namespace libtorrent
assert(i != m_downloads.end()); assert(i != m_downloads.end());
assert((int)i->finished_blocks.count() <= m_blocks_per_piece); assert((int)i->finished_blocks.count() <= m_blocks_per_piece);
int max_blocks = blocks_in_piece(index); int max_blocks = blocks_in_piece(index);
if ((int)i->finished_blocks.count() != max_blocks) return false; if ((int)i->finished_blocks.count() < max_blocks) return false;
assert((int)i->requested_blocks.count() == max_blocks); assert((int)i->requested_blocks.count() == max_blocks);
return true; return true;

View File

@ -1029,17 +1029,18 @@ namespace libtorrent { namespace detail
void session_impl::connection_completed( void session_impl::connection_completed(
boost::intrusive_ptr<peer_connection> const& p) boost::intrusive_ptr<peer_connection> const& p)
#ifndef NDEBUG #ifndef NDEBUG
try try
#endif #endif
{ {
mutex_t::scoped_lock l(m_mutex); mutex_t::scoped_lock l(m_mutex);
if (m_abort) return;
connection_map::iterator i = m_half_open.find(p->get_socket()); connection_map::iterator i = m_half_open.find(p->get_socket());
m_connections.insert(std::make_pair(p->get_socket(), p)); m_connections.insert(std::make_pair(p->get_socket(), p));
assert(i != m_half_open.end()); assert(i != m_half_open.end());
if (i != m_half_open.end()) m_half_open.erase(i); if (i != m_half_open.end()) m_half_open.erase(i);
if (m_abort) return;
process_connection_queue(); process_connection_queue();
} }
#ifndef NDEBUG #ifndef NDEBUG
@ -1123,13 +1124,13 @@ namespace libtorrent { namespace detail
assert(m_abort); assert(m_abort);
m_abort = true; m_abort = true;
while (!m_connections.empty()) m_connection_queue.clear();
m_connections.begin()->second->disconnect();
while (!m_half_open.empty()) while (!m_half_open.empty())
m_half_open.begin()->second->disconnect(); m_half_open.begin()->second->disconnect();
m_connection_queue.clear(); while (!m_connections.empty())
m_connections.begin()->second->disconnect();
#ifndef NDEBUG #ifndef NDEBUG
for (torrent_map::iterator i = m_torrents.begin(); for (torrent_map::iterator i = m_torrents.begin();