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:
parent
a68cdc5225
commit
73b5efbb23
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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…
x
Reference in New Issue
Block a user