From 6adbd75db8d871a10c28acf59ba27e0dc6fd08e3 Mon Sep 17 00:00:00 2001 From: Arvid Norberg Date: Mon, 11 Feb 2013 05:39:03 +0000 Subject: [PATCH] merged streaming fix from RC_0_16 --- ChangeLog | 2 ++ src/torrent.cpp | 36 ++++++++++++++++++++++++++---------- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index c0343d2b1..623fa2c9a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -13,6 +13,8 @@ * fix uTP edge case where udp socket buffer fills up * fix nagle implementation in uTP + * fixed streaming piece picking issue + 0.16.8 release * make rename_file create missing directories for new filename diff --git a/src/torrent.cpp b/src/torrent.cpp index a26e68ed1..84bb5642a 100644 --- a/src/torrent.cpp +++ b/src/torrent.cpp @@ -8150,23 +8150,39 @@ namespace libtorrent , ignore, piece_picker::none, 0); std::vector const& rq = c.request_queue(); + std::vector const& dq = c.download_queue(); bool added_request = false; - if (!interesting_blocks.empty() && std::find_if(rq.begin(), rq.end() - , has_block(interesting_blocks.front())) != rq.end()) + if (!interesting_blocks.empty()) { - c.make_time_critical(interesting_blocks.front()); - added_request = true; - } - else if (!interesting_blocks.empty()) - { - if (!c.add_request(interesting_blocks.front(), peer_connection::req_time_critical)) + bool already_requested = std::find_if(dq.begin(), dq.end() + , has_block(interesting_blocks.front())) != dq.end(); + if (already_requested) { - peers.erase(p); + // TODO: interesting_blocks should ideally not include blocks + // that have been requested already + interesting_blocks.erase(interesting_blocks.begin()); continue; } - added_request = true; + + bool already_in_queue = std::find_if(rq.begin(), rq.end() + , has_block(interesting_blocks.front())) != rq.end(); + + if (already_in_queue) + { + c.make_time_critical(interesting_blocks.front()); + added_request = true; + } + else + { + if (!c.add_request(interesting_blocks.front(), peer_connection::req_time_critical)) + { + peers.erase(p); + continue; + } + added_request = true; + } } // TODO: if there's been long enough since we requested something