diff --git a/src/base/bittorrent/sessionimpl.cpp b/src/base/bittorrent/sessionimpl.cpp index bfe0a5294..0275dea4e 100644 --- a/src/base/bittorrent/sessionimpl.cpp +++ b/src/base/bittorrent/sessionimpl.cpp @@ -544,6 +544,8 @@ SessionImpl::SessionImpl(QObject *parent) m_asyncWorker->setMaxThreadCount(1); m_asyncWorker->setObjectName("SessionImpl m_asyncWorker"); + m_alerts.reserve(1024); + if (port() < 0) m_port = Utils::Random::rand(1024, 65535); if (sslPort() < 0) @@ -3187,10 +3189,10 @@ void SessionImpl::saveResumeData() break; } - const std::vector alerts = getPendingAlerts(waitTime); + fetchPendingAlerts(waitTime); bool hasWantedAlert = false; - for (const lt::alert *alert : alerts) + for (const 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) @@ -5603,14 +5605,13 @@ void SessionImpl::handleIPFilterError() emit IPFilterParsed(true, 0); } -std::vector SessionImpl::getPendingAlerts(const lt::time_duration time) const +void SessionImpl::fetchPendingAlerts(const lt::time_duration time) { if (time > lt::time_duration::zero()) m_nativeSession->wait_for_alert(time); - std::vector alerts; - m_nativeSession->pop_alerts(&alerts); - return alerts; + m_alerts.clear(); + m_nativeSession->pop_alerts(&m_alerts); } TorrentContentLayout SessionImpl::torrentContentLayout() const @@ -5626,7 +5627,7 @@ void SessionImpl::setTorrentContentLayout(const TorrentContentLayout value) // Read alerts sent by libtorrent session void SessionImpl::readAlerts() { - const std::vector alerts = getPendingAlerts(); + fetchPendingAlerts(); Q_ASSERT(m_loadedTorrents.isEmpty()); Q_ASSERT(m_receivedAddTorrentAlertsCount == 0); @@ -5634,7 +5635,7 @@ void SessionImpl::readAlerts() if (!isRestored()) m_loadedTorrents.reserve(MAX_PROCESSING_RESUMEDATA_COUNT); - for (const lt::alert *a : alerts) + for (const lt::alert *a : m_alerts) handleAlert(a); if (m_receivedAddTorrentAlertsCount > 0) diff --git a/src/base/bittorrent/sessionimpl.h b/src/base/bittorrent/sessionimpl.h index 8876b9a31..9ac416e70 100644 --- a/src/base/bittorrent/sessionimpl.h +++ b/src/base/bittorrent/sessionimpl.h @@ -604,7 +604,7 @@ namespace BitTorrent void populateAdditionalTrackersFromURL(); - std::vector getPendingAlerts(lt::time_duration time = lt::time_duration::zero()) const; + void fetchPendingAlerts(lt::time_duration time = lt::time_duration::zero()); void moveTorrentStorage(const MoveStorageJob &job) const; void handleMoveTorrentStorageJobFinished(const Path &newPath); @@ -811,6 +811,7 @@ namespace BitTorrent QMap m_categories; TagSet m_tags; + std::vector m_alerts; // make it a class variable so it can preserve its allocated `capacity` qsizetype m_receivedAddTorrentAlertsCount = 0; QList m_loadedTorrents;