torrust-actix 4.2.3

A rich, fast and efficient Bittorrent Tracker.
use crate::stats::enums::stats_event::StatsEvent;
use crate::tracker::structs::cleanup_stats::CleanupStats;
use crate::tracker::structs::torrent_tracker::TorrentTracker;
use std::sync::atomic::{
    AtomicU64,
    Ordering
};
use std::sync::Arc;

impl CleanupStats {
    pub(crate) fn new() -> Self {
        Self {
            torrents: AtomicU64::new(0),
            seeds: AtomicU64::new(0),
            peers: AtomicU64::new(0),
        }
    }

    pub(crate) fn add_torrents(&self, n: u64) {
        self.torrents.fetch_add(n, Ordering::Relaxed);
    }

    pub(crate) fn add_seeds(&self, n: u64) {
        self.seeds.fetch_add(n, Ordering::Relaxed);
    }

    pub(crate) fn add_peers(&self, n: u64) {
        self.peers.fetch_add(n, Ordering::Relaxed);
    }

    pub(crate) fn apply_to_tracker(&self, tracker: &Arc<TorrentTracker>) {
        let torrents = self.torrents.swap(0, Ordering::Relaxed);
        let seeds = self.seeds.swap(0, Ordering::Relaxed);
        let peers = self.peers.swap(0, Ordering::Relaxed);
        if torrents > 0 {
            tracker.update_stats(StatsEvent::Torrents, -(torrents as i64));
        }
        if seeds > 0 {
            tracker.update_stats(StatsEvent::Seeds, -(seeds as i64));
        }
        if peers > 0 {
            tracker.update_stats(StatsEvent::Peers, -(peers as i64));
        }
    }
}