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; 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); m_asyncWorker->store(id, resumeData);
}); });

View file

@ -50,7 +50,7 @@ namespace BitTorrent
QList<TorrentID> registeredTorrents() const override; QList<TorrentID> registeredTorrents() const override;
LoadResumeDataResult load(const TorrentID &id) 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 remove(const TorrentID &id) const override;
void storeQueue(const QList<TorrentID> &queue) const override; void storeQueue(const QList<TorrentID> &queue) const override;

View file

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

View file

@ -49,7 +49,7 @@ namespace BitTorrent
QList<TorrentID> registeredTorrents() const override; QList<TorrentID> registeredTorrents() const override;
LoadResumeDataResult load(const TorrentID &id) 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 remove(const TorrentID &id) const override;
void storeQueue(const QList<TorrentID> &queue) 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 QList<TorrentID> registeredTorrents() const = 0;
virtual LoadResumeDataResult load(const TorrentID &id) 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 remove(const TorrentID &id) const = 0;
virtual void storeQueue(const QList<TorrentID> &queue) const = 0; virtual void storeQueue(const QList<TorrentID> &queue) const = 0;

View file

@ -3304,7 +3304,7 @@ void SessionImpl::saveResumeData()
fetchPendingAlerts(waitTime); fetchPendingAlerts(waitTime);
bool hasWantedAlert = false; bool hasWantedAlert = false;
for (const lt::alert *alert : m_alerts) for (lt::alert *alert : m_alerts)
{ {
if (const int alertType = alert->type(); if (const int alertType = alert->type();
(alertType == lt::save_resume_data_alert::alert_type) || (alertType == lt::save_resume_data_failed_alert::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); 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()); const auto iter = m_changedTorrentIDs.constFind(torrent->id());
if (iter != m_changedTorrentIDs.cend()) if (iter != m_changedTorrentIDs.cend())
{ {
@ -5803,7 +5803,7 @@ void SessionImpl::readAlerts()
if (!isRestored()) if (!isRestored())
m_loadedTorrents.reserve(MAX_PROCESSING_RESUMEDATA_COUNT); m_loadedTorrents.reserve(MAX_PROCESSING_RESUMEDATA_COUNT);
for (const lt::alert *a : m_alerts) for (lt::alert *a : m_alerts)
handleAlert(a); handleAlert(a);
if (m_receivedAddTorrentAlertsCount > 0) if (m_receivedAddTorrentAlertsCount > 0)
@ -5837,7 +5837,7 @@ void SessionImpl::handleAddTorrentAlert(const lt::add_torrent_alert *alert)
handleAlert(alert); handleAlert(alert);
} }
void SessionImpl::handleAlert(const lt::alert *alert) void SessionImpl::handleAlert(lt::alert *alert)
{ {
try try
{ {
@ -5864,7 +5864,7 @@ void SessionImpl::handleAlert(const lt::alert *alert)
handleTorrentFinishedAlert(static_cast<const lt::torrent_finished_alert *>(alert)); handleTorrentFinishedAlert(static_cast<const lt::torrent_finished_alert *>(alert));
break; break;
case lt::save_resume_data_alert::alert_type: 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; break;
case lt::save_resume_data_failed_alert::alert_type: case lt::save_resume_data_failed_alert::alert_type:
handleSaveResumeDataFailedAlert(static_cast<const lt::save_resume_data_failed_alert *>(alert)); 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(); 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 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, // 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; --m_numResumeData;
if (TorrentImpl *torrent = getTorrent(alert->handle)) [[likely]] 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) void SessionImpl::handleSaveResumeDataFailedAlert(const lt::save_resume_data_failed_alert *alert)

View file

@ -478,7 +478,7 @@ namespace BitTorrent
void handleTorrentTrackersChanged(TorrentImpl *torrent); void handleTorrentTrackersChanged(TorrentImpl *torrent);
void handleTorrentUrlSeedsAdded(TorrentImpl *torrent, const QList<QUrl> &newUrlSeeds); void handleTorrentUrlSeedsAdded(TorrentImpl *torrent, const QList<QUrl> &newUrlSeeds);
void handleTorrentUrlSeedsRemoved(TorrentImpl *torrent, const QList<QUrl> &urlSeeds); 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 handleTorrentInfoHashChanged(TorrentImpl *torrent, const InfoHash &prevInfoHash);
void handleTorrentStorageMovingStateChanged(TorrentImpl *torrent); void handleTorrentStorageMovingStateChanged(TorrentImpl *torrent);
@ -579,7 +579,7 @@ namespace BitTorrent
void updateSeedingLimitTimer(); void updateSeedingLimitTimer();
void exportTorrentFile(const Torrent *torrent, const Path &folderPath); 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 handleAddTorrentAlert(const lt::add_torrent_alert *alert);
void handleStateUpdateAlert(const lt::state_update_alert *alert); void handleStateUpdateAlert(const lt::state_update_alert *alert);
void handleMetadataReceivedAlert(const lt::metadata_received_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 handleFileRenamedAlert(const lt::file_renamed_alert *alert);
void handleFileRenameFailedAlert(const lt::file_rename_failed_alert *alert); void handleFileRenameFailedAlert(const lt::file_rename_failed_alert *alert);
void handlePerformanceAlert(const lt::performance_alert *alert) const; 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 handleSaveResumeDataFailedAlert(const lt::save_resume_data_failed_alert *alert);
void handleTorrentCheckedAlert(const lt::torrent_checked_alert *alert); void handleTorrentCheckedAlert(const lt::torrent_checked_alert *alert);
void handleTorrentFinishedAlert(const lt::torrent_finished_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); applyFirstLastPiecePriority(true);
m_maintenanceJob = MaintenanceJob::None; m_maintenanceJob = MaintenanceJob::None;
prepareResumeData(p); prepareResumeData(std::move(p));
m_session->handleTorrentMetadataReceived(this); 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 // We shouldn't save upload_mode flag to allow torrent operate normally on next run
m_ltAddTorrentParams.flags &= ~lt::torrent_flags::upload_mode; m_ltAddTorrentParams.flags &= ~lt::torrent_flags::upload_mode;
const LoadTorrentParams resumeData LoadTorrentParams resumeData
{ {
.ltAddTorrentParams = m_ltAddTorrentParams, .ltAddTorrentParams = m_ltAddTorrentParams,
.name = m_name, .name = m_name,
@ -2225,7 +2225,7 @@ void TorrentImpl::prepareResumeData(lt::add_torrent_params params)
.sslParameters = m_sslParams .sslParameters = m_sslParams
}; };
m_session->handleTorrentResumeDataReady(this, resumeData); m_session->handleTorrentResumeDataReady(this, std::move(resumeData));
} }
void TorrentImpl::handleFastResumeRejected() void TorrentImpl::handleFastResumeRejected()