From 75d1ac8889be136be54d6fb9638ed2ec62e2355e Mon Sep 17 00:00:00 2001 From: Vladimir Golovnev Date: Tue, 5 Nov 2024 16:43:43 +0300 Subject: [PATCH] Optimize conversion of time points from libtorrent to Qt clocks Obtain current date time of Qt and libtorrent clocks only once for processing entire current libtorrent alerts bunch. PR #21764. --- src/base/bittorrent/sessionimpl.cpp | 11 +++++++++++ src/base/bittorrent/sessionimpl.h | 5 +++++ src/base/bittorrent/torrentimpl.cpp | 21 ++++++++++----------- 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/src/base/bittorrent/sessionimpl.cpp b/src/base/bittorrent/sessionimpl.cpp index 6d201bccc..38f25693f 100644 --- a/src/base/bittorrent/sessionimpl.cpp +++ b/src/base/bittorrent/sessionimpl.cpp @@ -5504,6 +5504,11 @@ void SessionImpl::setTorrentContentLayout(const TorrentContentLayout value) // Read alerts sent by libtorrent session void SessionImpl::readAlerts() { + // cache current datetime of Qt and libtorrent clocks in order + // to optimize conversion of time points from lt to Qt clocks + m_ltNow = lt::clock_type::now(); + m_qNow = QDateTime::currentDateTime(); + const std::vector alerts = getPendingAlerts(); Q_ASSERT(m_loadedTorrents.isEmpty()); @@ -6373,3 +6378,9 @@ void SessionImpl::handleRemovedTorrent(const TorrentID &torrentID, const QString m_removingTorrents.erase(removingTorrentDataIter); } + +QDateTime SessionImpl::fromLTTimePoint32(const libtorrent::time_point32 &timePoint) const +{ + const auto secsSinceNow = lt::duration_cast(timePoint - m_ltNow + lt::milliseconds(500)).count(); + return m_qNow.addSecs(secsSinceNow); +} diff --git a/src/base/bittorrent/sessionimpl.h b/src/base/bittorrent/sessionimpl.h index 6899fedfc..0a1d13693 100644 --- a/src/base/bittorrent/sessionimpl.h +++ b/src/base/bittorrent/sessionimpl.h @@ -476,6 +476,8 @@ namespace BitTorrent void addMappedPorts(const QSet &ports); void removeMappedPorts(const QSet &ports); + QDateTime fromLTTimePoint32(const lt::time_point32 &timePoint) const; + template void invoke(Func &&func) { @@ -826,6 +828,9 @@ namespace BitTorrent QList m_pendingFinishedTorrents; + QDateTime m_qNow; + lt::clock_type::time_point m_ltNow; + friend void Session::initInstance(); friend void Session::freeInstance(); friend Session *Session::instance(); diff --git a/src/base/bittorrent/torrentimpl.cpp b/src/base/bittorrent/torrentimpl.cpp index 02a8d696e..4b230e9fa 100644 --- a/src/base/bittorrent/torrentimpl.cpp +++ b/src/base/bittorrent/torrentimpl.cpp @@ -92,22 +92,15 @@ namespace return entry; } - QDateTime fromLTTimePoint32(const lt::time_point32 &timePoint) - { - const auto ltNow = lt::clock_type::now(); - const auto qNow = QDateTime::currentDateTime(); - const auto secsSinceNow = lt::duration_cast(timePoint - ltNow + lt::milliseconds(500)).count(); - - return qNow.addSecs(secsSinceNow); - } - QString toString(const lt::tcp::endpoint <TCPEndpoint) { return QString::fromStdString((std::stringstream() << ltTCPEndpoint).str()); } + template void updateTrackerEntryStatus(TrackerEntryStatus &trackerEntryStatus, const lt::announce_entry &nativeEntry - , const QSet &btProtocols, const QHash> &updateInfo) + , const QSet &btProtocols, const QHash> &updateInfo + , const FromLTTimePoint32Func &fromLTTimePoint32) { Q_ASSERT(trackerEntryStatus.url == QString::fromStdString(nativeEntry.url)); @@ -1769,7 +1762,13 @@ TrackerEntryStatus TorrentImpl::updateTrackerEntryStatus(const lt::announce_entr #else const QSet btProtocols {1}; #endif - ::updateTrackerEntryStatus(*it, announceEntry, btProtocols, updateInfo); + + const auto fromLTTimePoint32 = [this](const lt::time_point32 &timePoint) + { + return m_session->fromLTTimePoint32(timePoint); + }; + ::updateTrackerEntryStatus(*it, announceEntry, btProtocols, updateInfo, fromLTTimePoint32); + return *it; }