diff --git a/ChangeLog b/ChangeLog index 334c44fee..bca1f533e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -79,6 +79,7 @@ release 0.14.6 * fixed checking of fast and suggest messages when used with magnet links * fixed bug where web seeds would not disconnect if being resolved when the torrent was paused + * fixed download piece performance bug in piece picker release 0.14.5 diff --git a/src/piece_picker.cpp b/src/piece_picker.cpp index 9117af94e..6123b1c75 100644 --- a/src/piece_picker.cpp +++ b/src/piece_picker.cpp @@ -765,16 +765,29 @@ namespace libtorrent void piece_picker::sort_piece(std::vector::iterator dp) { TORRENT_ASSERT(m_piece_map[dp->index].downloading); - if (dp == m_downloads.begin()) return; int complete = dp->writing + dp->finished; - for (std::vector::iterator i = dp, j(dp-1); - i != m_downloads.begin(); --i, --j) + if (dp != m_downloads.begin()) { - TORRENT_ASSERT(j >= m_downloads.begin()); - if (j->finished + j->writing >= complete) return; + for (std::vector::iterator j(dp-1); + dp != m_downloads.begin(); --dp, --j) + { + TORRENT_ASSERT(j >= m_downloads.begin()); + if (j->finished + j->writing >= complete) break; + using std::swap; + swap(*j, *dp); + if (j == m_downloads.begin()) return; + } + } + + TORRENT_ASSERT(dp != m_downloads.end()); + for (std::vector::iterator j(dp+1); + dp != m_downloads.end() - 1; ++dp, ++j) + { + TORRENT_ASSERT(j < m_downloads.end()); + if (j->finished + j->writing <= complete) break; using std::swap; - swap(*j, *i); - if (j == m_downloads.begin()) break; + swap(*j, *dp); + if (j == m_downloads.end() - 1) return; } }