Browse Source

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.
adaptive-webui-19844
Chocobo1 6 years ago
parent
commit
73b5efbb23
No known key found for this signature in database
GPG Key ID: 210D9C873253A68C
  1. 14
      src/base/bittorrent/torrenthandle.cpp
  2. 1
      src/base/bittorrent/torrenthandle.h

14
src/base/bittorrent/torrenthandle.cpp

@ -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();
} }

1
src/base/bittorrent/torrenthandle.h

@ -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;

Loading…
Cancel
Save