diff --git a/src/base/bittorrent/sessionimpl.cpp b/src/base/bittorrent/sessionimpl.cpp index ac14c52a5..abf56a9ba 100644 --- a/src/base/bittorrent/sessionimpl.cpp +++ b/src/base/bittorrent/sessionimpl.cpp @@ -66,6 +66,7 @@ #include #include #include +#include #include #include #include @@ -6234,6 +6235,8 @@ void SessionImpl::handleTrackerAlert(const lt::tracker_alert *alert) if (!torrent) return; + [[maybe_unused]] const QMutexLocker updatedTrackerStatusesLocker {&m_updatedTrackerStatusesMutex}; + const auto prevSize = m_updatedTrackerStatuses.size(); QMap &updateInfo = m_updatedTrackerStatuses[torrent->nativeHandle()][std::string(alert->tracker_url())][alert->local_endpoint]; if (prevSize < m_updatedTrackerStatuses.size()) @@ -6330,14 +6333,17 @@ void SessionImpl::updateTrackerEntryStatuses(lt::torrent_handle torrentHandle) try { std::vector nativeTrackers = torrentHandle.trackers(); - invoke([this, torrentHandle, nativeTrackers = std::move(nativeTrackers)] + + QMutexLocker updatedTrackerStatusesLocker {&m_updatedTrackerStatusesMutex}; + QHash>> updatedTrackers = m_updatedTrackerStatuses.take(torrentHandle); + updatedTrackerStatusesLocker.unlock(); + + invoke([this, torrentHandle, nativeTrackers = std::move(nativeTrackers), updatedTrackers = std::move(updatedTrackers)] { TorrentImpl *torrent = m_torrents.value(torrentHandle.info_hash()); if (!torrent || torrent->isStopped()) return; - QHash>> updatedTrackers = m_updatedTrackerStatuses.take(torrentHandle); - QHash trackers; trackers.reserve(updatedTrackers.size()); for (const lt::announce_entry &announceEntry : nativeTrackers) diff --git a/src/base/bittorrent/sessionimpl.h b/src/base/bittorrent/sessionimpl.h index 32aeed86d..7298afabe 100644 --- a/src/base/bittorrent/sessionimpl.h +++ b/src/base/bittorrent/sessionimpl.h @@ -42,6 +42,7 @@ #include #include #include +#include #include #include #include @@ -799,6 +800,7 @@ namespace BitTorrent // This field holds amounts of peers reported by trackers in their responses to announces // (torrent.tracker_name.tracker_local_endpoint.protocol_version.num_peers) QHash>>> m_updatedTrackerStatuses; + QMutex m_updatedTrackerStatusesMutex; // I/O errored torrents QSet m_recentErroredTorrents;