From 8709ec60e69a31367da325e17463714aa5a5d2f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C5=93ur?= Date: Sat, 16 Mar 2024 08:04:43 +0800 Subject: [PATCH] run peerMgrPeerStats in session thread (#5992) * run peerMgrPeerStats in session thread * code-review: add a TODO: for refactoring --- libtransmission/peer-mgr.cc | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/libtransmission/peer-mgr.cc b/libtransmission/peer-mgr.cc index fc0550960..0ff70b980 100644 --- a/libtransmission/peer-mgr.cc +++ b/libtransmission/peer-mgr.cc @@ -1841,13 +1841,22 @@ tr_peer_stat* tr_peerMgrPeerStats(tr_torrent const* tor, size_t* setme_count) auto const n = std::size(peers); auto* const ret = new tr_peer_stat[n]; - auto const now = tr_time(); - auto const now_msec = tr_time_msec(); - std::transform( - std::begin(peers), - std::end(peers), - ret, - [&now, &now_msec](auto const* peer) { return get_peer_stats(peer, now, now_msec); }); + // TODO: re-implement as a callback solution (similar to tr_sessionSetCompletenessCallback) in case present call to run_in_session_thread is causing hangs when the peers info window is displayed. + auto done_promise = std::promise{}; + auto done_future = done_promise.get_future(); + tor->session->run_in_session_thread( + [&peers, &ret, &done_promise]() + { + auto const now = tr_time(); + auto const now_msec = tr_time_msec(); + std::transform( + std::begin(peers), + std::end(peers), + ret, + [&now, &now_msec](auto const* peer) { return get_peer_stats(peer, now, now_msec); }); + done_promise.set_value(); + }); + done_future.wait(); *setme_count = n; return ret;