#include "./transfer_stats_systems.hpp" #include "./components.hpp" #include namespace Systems { void transfer_tally_update(ObjectRegistry& os_reg, const float time_now) { std::vector tally_to_remove; // for each tally -> stats separated os_reg.view().each([&os_reg, time_now, &tally_to_remove](const auto ov, Components::TransferStatsTally& tally_comp) { // for each peer std::vector to_remove; for (auto&& [peer_c, peer] : tally_comp.tally) { auto& tss = os_reg.get_or_emplace(ov).stats; // special logic // if newest older than 2sec // discard if (!peer.recently_sent.empty() && time_now - peer.recently_sent.back().time_point >= 2.f) { // clean up stale auto peer_in_stats_it = tss.find(peer_c); if (peer_in_stats_it != tss.end()) { peer_in_stats_it->second.rate_up = 0.f; } peer.recently_sent.clear(); if (peer.recently_received.empty()) { to_remove.push_back(peer_c); } } else { // else trim too old front peer.trimSent(time_now); size_t tally_bytes {0u}; for (auto& [time, bytes, accounted] : peer.recently_sent) { if (!accounted) { tss[peer_c].total_up += bytes; accounted = true; } tally_bytes += bytes; } tss[peer_c].rate_up = tally_bytes / (time_now - peer.recently_sent.front().time_point + 0.00001f); } if (!peer.recently_received.empty() && time_now - peer.recently_received.back().time_point >= 2.f) { // clean up stale auto peer_in_stats_it = tss.find(peer_c); if (peer_in_stats_it != tss.end()) { peer_in_stats_it->second.rate_down = 0.f; } peer.recently_received.clear(); if (peer.recently_sent.empty()) { to_remove.push_back(peer_c); } } else { // else trim too old front peer.trimReceived(time_now); size_t tally_bytes {0u}; for (auto& [time, bytes, accounted] : peer.recently_received) { if (!accounted) { tss[peer_c].total_down += bytes; accounted = true; } tally_bytes += bytes; } tss[peer_c].rate_down = tally_bytes / (time_now - peer.recently_received.front().time_point + 0.00001f); } } for (const auto c : to_remove) { tally_comp.tally.erase(c); } if (tally_comp.tally.empty()) { tally_to_remove.push_back(ov); } }); // for each stats separated -> stats (total) os_reg.view().each([&os_reg](const auto ov, Components::TransferStatsSeparated& tss_comp, const auto&) { Components::TransferStats& stats = os_reg.get_or_emplace(ov); stats = {}; // reset for (const auto& [_, peer_stats] : tss_comp.stats) { stats.rate_up += peer_stats.rate_up; stats.rate_down += peer_stats.rate_down; stats.total_up += peer_stats.total_up; stats.total_down += peer_stats.total_down; } #if 0 std::cout << "updated stats:\n" << " rate u:" << stats.rate_up/1024 << "KiB/s d:" << stats.rate_down/1024 << "KiB/s\n" << " total u:" << stats.total_up/1024 << "KiB d:" << stats.total_down/1024 << "KiB\n" ; #endif }); for (const auto ov : tally_to_remove) { os_reg.remove(ov); } } } // Systems