Avoid data copying when prepare resume data

PR #22812.
This commit is contained in:
Vladimir Golovnev 2025-06-06 08:59:39 +03:00 committed by GitHub
parent 617b1da842
commit 526abdf7ce
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 28 additions and 28 deletions

View file

@ -342,9 +342,9 @@ BitTorrent::LoadResumeDataResult BitTorrent::BencodeResumeDataStorage::loadTorre
return torrentParams;
}
void BitTorrent::BencodeResumeDataStorage::store(const TorrentID &id, const LoadTorrentParams &resumeData) const
void BitTorrent::BencodeResumeDataStorage::store(const TorrentID &id, LoadTorrentParams resumeData) const
{
QMetaObject::invokeMethod(m_asyncWorker, [this, id, resumeData]()
QMetaObject::invokeMethod(m_asyncWorker, [this, id, resumeData = std::move(resumeData)]
{
m_asyncWorker->store(id, resumeData);
});

View file

@ -50,7 +50,7 @@ namespace BitTorrent
QList<TorrentID> registeredTorrents() const override;
LoadResumeDataResult load(const TorrentID &id) const override;
void store(const TorrentID &id, const LoadTorrentParams &resumeData) const override;
void store(const TorrentID &id, LoadTorrentParams resumeData) const override;
void remove(const TorrentID &id) const override;
void storeQueue(const QList<TorrentID> &queue) const override;

View file

@ -86,7 +86,7 @@ namespace
class StoreJob final : public Job
{
public:
StoreJob(const TorrentID &torrentID, const LoadTorrentParams &resumeData);
StoreJob(const TorrentID &torrentID, LoadTorrentParams resumeData);
void perform(QSqlDatabase db) override;
private:
@ -231,7 +231,7 @@ namespace BitTorrent
void run() override;
void requestInterruption();
void store(const TorrentID &id, const LoadTorrentParams &resumeData);
void store(const TorrentID &id, LoadTorrentParams resumeData);
void remove(const TorrentID &id);
void storeQueue(const QList<TorrentID> &queue);
@ -327,9 +327,9 @@ BitTorrent::LoadResumeDataResult BitTorrent::DBResumeDataStorage::load(const Tor
return parseQueryResultRow(query);
}
void BitTorrent::DBResumeDataStorage::store(const TorrentID &id, const LoadTorrentParams &resumeData) const
void BitTorrent::DBResumeDataStorage::store(const TorrentID &id, LoadTorrentParams resumeData) const
{
m_asyncWorker->store(id, resumeData);
m_asyncWorker->store(id, std::move(resumeData));
}
void BitTorrent::DBResumeDataStorage::remove(const BitTorrent::TorrentID &id) const
@ -769,9 +769,9 @@ void DBResumeDataStorage::Worker::requestInterruption()
m_waitCondition.wakeAll();
}
void BitTorrent::DBResumeDataStorage::Worker::store(const TorrentID &id, const LoadTorrentParams &resumeData)
void BitTorrent::DBResumeDataStorage::Worker::store(const TorrentID &id, LoadTorrentParams resumeData)
{
addJob(std::make_unique<StoreJob>(id, resumeData));
addJob(std::make_unique<StoreJob>(id, std::move(resumeData)));
}
void BitTorrent::DBResumeDataStorage::Worker::remove(const TorrentID &id)
@ -797,9 +797,9 @@ namespace
{
using namespace BitTorrent;
StoreJob::StoreJob(const TorrentID &torrentID, const LoadTorrentParams &resumeData)
StoreJob::StoreJob(const TorrentID &torrentID, LoadTorrentParams resumeData)
: m_torrentID {torrentID}
, m_resumeData {resumeData}
, m_resumeData {std::move(resumeData)}
{
}

View file

@ -49,7 +49,7 @@ namespace BitTorrent
QList<TorrentID> registeredTorrents() const override;
LoadResumeDataResult load(const TorrentID &id) const override;
void store(const TorrentID &id, const LoadTorrentParams &resumeData) const override;
void store(const TorrentID &id, LoadTorrentParams resumeData) const override;
void remove(const TorrentID &id) const override;
void storeQueue(const QList<TorrentID> &queue) const override;

View file

@ -60,7 +60,7 @@ namespace BitTorrent
virtual QList<TorrentID> registeredTorrents() const = 0;
virtual LoadResumeDataResult load(const TorrentID &id) const = 0;
virtual void store(const TorrentID &id, const LoadTorrentParams &resumeData) const = 0;
virtual void store(const TorrentID &id, LoadTorrentParams resumeData) const = 0;
virtual void remove(const TorrentID &id) const = 0;
virtual void storeQueue(const QList<TorrentID> &queue) const = 0;

View file

@ -1555,7 +1555,7 @@ void SessionImpl::processNextResumeData(ResumeSessionContext *context)
// == END UPGRADE CODE ==
if (needStore)
m_resumeDataStorage->store(torrentID, resumeData);
m_resumeDataStorage->store(torrentID, resumeData);
const QString category = resumeData.category;
bool isCategoryRecovered = context->recoveredCategories.contains(category);
@ -3304,7 +3304,7 @@ void SessionImpl::saveResumeData()
fetchPendingAlerts(waitTime);
bool hasWantedAlert = false;
for (const lt::alert *alert : m_alerts)
for (lt::alert *alert : m_alerts)
{
if (const int alertType = alert->type();
(alertType == lt::save_resume_data_alert::alert_type) || (alertType == lt::save_resume_data_failed_alert::alert_type)
@ -5403,9 +5403,9 @@ void SessionImpl::handleTorrentFinished(TorrentImpl *const torrent)
m_pendingFinishedTorrents.append(torrent);
}
void SessionImpl::handleTorrentResumeDataReady(TorrentImpl *const torrent, const LoadTorrentParams &data)
void SessionImpl::handleTorrentResumeDataReady(TorrentImpl *const torrent, LoadTorrentParams data)
{
m_resumeDataStorage->store(torrent->id(), data);
m_resumeDataStorage->store(torrent->id(), std::move(data));
const auto iter = m_changedTorrentIDs.constFind(torrent->id());
if (iter != m_changedTorrentIDs.cend())
{
@ -5803,7 +5803,7 @@ void SessionImpl::readAlerts()
if (!isRestored())
m_loadedTorrents.reserve(MAX_PROCESSING_RESUMEDATA_COUNT);
for (const lt::alert *a : m_alerts)
for (lt::alert *a : m_alerts)
handleAlert(a);
if (m_receivedAddTorrentAlertsCount > 0)
@ -5837,7 +5837,7 @@ void SessionImpl::handleAddTorrentAlert(const lt::add_torrent_alert *alert)
handleAlert(alert);
}
void SessionImpl::handleAlert(const lt::alert *alert)
void SessionImpl::handleAlert(lt::alert *alert)
{
try
{
@ -5864,7 +5864,7 @@ void SessionImpl::handleAlert(const lt::alert *alert)
handleTorrentFinishedAlert(static_cast<const lt::torrent_finished_alert *>(alert));
break;
case lt::save_resume_data_alert::alert_type:
handleSaveResumeDataAlert(static_cast<const lt::save_resume_data_alert *>(alert));
handleSaveResumeDataAlert(static_cast<lt::save_resume_data_alert *>(alert));
break;
case lt::save_resume_data_failed_alert::alert_type:
handleSaveResumeDataFailedAlert(static_cast<const lt::save_resume_data_failed_alert *>(alert));
@ -6483,7 +6483,7 @@ void SessionImpl::handleTorrentFinishedAlert([[maybe_unused]] const lt::torrent_
torrent->handleTorrentFinished();
}
void SessionImpl::handleSaveResumeDataAlert(const lt::save_resume_data_alert *alert)
void SessionImpl::handleSaveResumeDataAlert(lt::save_resume_data_alert *alert)
{
// The torrent can be deleted between the time the resume data was requested and
// the time we received the appropriate alert. We have to decrease `m_numResumeData` anyway,
@ -6491,7 +6491,7 @@ void SessionImpl::handleSaveResumeDataAlert(const lt::save_resume_data_alert *al
--m_numResumeData;
if (TorrentImpl *torrent = getTorrent(alert->handle)) [[likely]]
torrent->handleSaveResumeData(alert->params); // TODO: Try to move `alert->params`
torrent->handleSaveResumeData(std::move(alert->params));
}
void SessionImpl::handleSaveResumeDataFailedAlert(const lt::save_resume_data_failed_alert *alert)

View file

@ -478,7 +478,7 @@ namespace BitTorrent
void handleTorrentTrackersChanged(TorrentImpl *torrent);
void handleTorrentUrlSeedsAdded(TorrentImpl *torrent, const QList<QUrl> &newUrlSeeds);
void handleTorrentUrlSeedsRemoved(TorrentImpl *torrent, const QList<QUrl> &urlSeeds);
void handleTorrentResumeDataReady(TorrentImpl *torrent, const LoadTorrentParams &data);
void handleTorrentResumeDataReady(TorrentImpl *torrent, LoadTorrentParams data);
void handleTorrentInfoHashChanged(TorrentImpl *torrent, const InfoHash &prevInfoHash);
void handleTorrentStorageMovingStateChanged(TorrentImpl *torrent);
@ -579,7 +579,7 @@ namespace BitTorrent
void updateSeedingLimitTimer();
void exportTorrentFile(const Torrent *torrent, const Path &folderPath);
void handleAlert(const lt::alert *alert);
void handleAlert(lt::alert *alert);
void handleAddTorrentAlert(const lt::add_torrent_alert *alert);
void handleStateUpdateAlert(const lt::state_update_alert *alert);
void handleMetadataReceivedAlert(const lt::metadata_received_alert *alert);
@ -613,7 +613,7 @@ namespace BitTorrent
void handleFileRenamedAlert(const lt::file_renamed_alert *alert);
void handleFileRenameFailedAlert(const lt::file_rename_failed_alert *alert);
void handlePerformanceAlert(const lt::performance_alert *alert) const;
void handleSaveResumeDataAlert(const lt::save_resume_data_alert *alert);
void handleSaveResumeDataAlert(lt::save_resume_data_alert *alert);
void handleSaveResumeDataFailedAlert(const lt::save_resume_data_failed_alert *alert);
void handleTorrentCheckedAlert(const lt::torrent_checked_alert *alert);
void handleTorrentFinishedAlert(const lt::torrent_finished_alert *alert);

View file

@ -1835,7 +1835,7 @@ void TorrentImpl::endReceivedMetadataHandling(const Path &savePath, const PathLi
applyFirstLastPiecePriority(true);
m_maintenanceJob = MaintenanceJob::None;
prepareResumeData(p);
prepareResumeData(std::move(p));
m_session->handleTorrentMetadataReceived(this);
}
@ -2202,7 +2202,7 @@ void TorrentImpl::prepareResumeData(lt::add_torrent_params params)
// We shouldn't save upload_mode flag to allow torrent operate normally on next run
m_ltAddTorrentParams.flags &= ~lt::torrent_flags::upload_mode;
const LoadTorrentParams resumeData
LoadTorrentParams resumeData
{
.ltAddTorrentParams = m_ltAddTorrentParams,
.name = m_name,
@ -2225,7 +2225,7 @@ void TorrentImpl::prepareResumeData(lt::add_torrent_params params)
.sslParameters = m_sslParams
};
m_session->handleTorrentResumeDataReady(this, resumeData);
m_session->handleTorrentResumeDataReady(this, std::move(resumeData));
}
void TorrentImpl::handleFastResumeRejected()