diff --git a/include/libtorrent/session_settings.hpp b/include/libtorrent/session_settings.hpp index a792e296a..8d57b27ec 100644 --- a/include/libtorrent/session_settings.hpp +++ b/include/libtorrent/session_settings.hpp @@ -87,7 +87,7 @@ namespace libtorrent , tracker_receive_timeout(20) , stop_tracker_timeout(5) , tracker_maximum_response_length(1024*1024) - , piece_timeout(120) + , piece_timeout(10) , request_queue_time(3.f) , max_allowed_in_request_queue(250) , max_out_request_queue(200) diff --git a/include/libtorrent/torrent.hpp b/include/libtorrent/torrent.hpp index 60140f2c2..20779e6f5 100755 --- a/include/libtorrent/torrent.hpp +++ b/include/libtorrent/torrent.hpp @@ -424,6 +424,7 @@ namespace libtorrent } int block_size() const { TORRENT_ASSERT(m_block_size > 0); return m_block_size; } + peer_request to_req(piece_block const& p); // this will tell all peers that we just got his piece // and also let the piece picker know that we have this piece diff --git a/src/peer_connection.cpp b/src/peer_connection.cpp index e1d2f2556..2032b54c5 100755 --- a/src/peer_connection.cpp +++ b/src/peer_connection.cpp @@ -2209,18 +2209,19 @@ namespace libtorrent piece_picker& picker = t->picker(); while (!m_download_queue.empty()) { - picker.abort_download(m_download_queue.back()); + piece_block const& r = m_download_queue.back(); + picker.abort_download(r); + write_cancel(t->to_req(r)); m_download_queue.pop_back(); } while (!m_request_queue.empty()) { - picker.abort_download(m_request_queue.back()); + piece_block const& r = m_request_queue.back(); + picker.abort_download(r); + write_cancel(t->to_req(r)); m_request_queue.pop_back(); } - // TODO: If we have a limited number of upload - // slots, choke this peer - m_assume_fifo = true; request_a_block(*t, *this); diff --git a/src/torrent.cpp b/src/torrent.cpp index db65e3e13..d14b3075d 100755 --- a/src/torrent.cpp +++ b/src/torrent.cpp @@ -326,6 +326,21 @@ namespace libtorrent disconnect_all(); } + peer_request torrent::to_req(piece_block const& p) + { + int block_offset = p.block_index * m_block_size; + int block_size = (std::min)((int)torrent_file().piece_size( + p.piece_index) - block_offset, m_block_size); + TORRENT_ASSERT(block_size > 0); + TORRENT_ASSERT(block_size <= m_block_size); + + peer_request r; + r.piece = p.piece_index; + r.start = block_offset; + r.length = block_size; + return r; + } + std::string torrent::name() const { if (valid_metadata()) return m_torrent_file->name();