1
0
mirror of https://github.com/d47081/qBittorrent.git synced 2025-02-10 13:54:23 +00:00

Avoid potentially setting the wrong piece priorities

Updating file priorities is an async operation in libtorrent, when we
just updated it and immediately query it, we might get the
old/wrong values, so we rely on `updatedFilePrio` in this case.
This commit is contained in:
Chocobo1 2018-07-29 16:14:17 +08:00
parent a68cdc5225
commit 73b5efbb23
No known key found for this signature in database
GPG Key ID: 210D9C873253A68C
2 changed files with 12 additions and 3 deletions

View File

@ -1300,13 +1300,21 @@ void TorrentHandle::toggleSequentialDownload()
void TorrentHandle::setFirstLastPiecePriority(const bool enabled) void TorrentHandle::setFirstLastPiecePriority(const bool enabled)
{ {
setFirstLastPiecePriorityImpl(enabled);
}
void TorrentHandle::setFirstLastPiecePriorityImpl(const bool enabled, const QVector<int> &updatedFilePrio)
{
// Download first and last pieces first for every file in the torrent
if (!hasMetadata()) { if (!hasMetadata()) {
m_needsToSetFirstLastPiecePriority = enabled; m_needsToSetFirstLastPiecePriority = enabled;
return; return;
} }
// Download first and last pieces first for every file in the torrent // Updating file priorities is an async operation in libtorrent, when we just updated it and immediately query it
const std::vector<int> filePriorities = nativeHandle().file_priorities(); // we might get the old/wrong values, so we rely on `updatedFilePrio` in this case.
const std::vector<int> filePriorities = !updatedFilePrio.isEmpty() ? updatedFilePrio.toStdVector() : nativeHandle().file_priorities();
std::vector<int> piecePriorities = nativeHandle().piece_priorities(); std::vector<int> piecePriorities = nativeHandle().piece_priorities();
for (int index = 0; index < static_cast<int>(filePriorities.size()); ++index) { for (int index = 0; index < static_cast<int>(filePriorities.size()); ++index) {
const int filePrio = filePriorities[index]; const int filePrio = filePriorities[index];
@ -2064,7 +2072,7 @@ void TorrentHandle::prioritizeFiles(const QVector<int> &priorities)
// Restore first/last piece first option if necessary // Restore first/last piece first option if necessary
if (firstLastPieceFirst) if (firstLastPieceFirst)
setFirstLastPiecePriority(true); setFirstLastPiecePriorityImpl(true, priorities);
updateStatus(); updateStatus();
} }

View File

@ -420,6 +420,7 @@ namespace BitTorrent
bool addTracker(const TrackerEntry &tracker); bool addTracker(const TrackerEntry &tracker);
bool addUrlSeed(const QUrl &urlSeed); bool addUrlSeed(const QUrl &urlSeed);
bool removeUrlSeed(const QUrl &urlSeed); bool removeUrlSeed(const QUrl &urlSeed);
void setFirstLastPiecePriorityImpl(bool enabled, const QVector<int> &updatedFilePrio = {});
Session *const m_session; Session *const m_session;
libtorrent::torrent_handle m_nativeHandle; libtorrent::torrent_handle m_nativeHandle;