use std::sync::atomic::{AtomicU64, Ordering};
#[derive(Debug, Default)]
#[allow(dead_code)] pub struct DynamicForwarderStats {
pub(crate) socks_connections_accepted: AtomicU64,
pub(crate) active_connections: AtomicU64,
pub(crate) socks_connections_failed: AtomicU64,
pub(crate) total_bytes_transferred: AtomicU64,
pub(crate) socks4_requests: AtomicU64,
pub(crate) socks5_requests: AtomicU64,
pub(crate) dns_resolutions: AtomicU64,
pub(crate) dns_failures: AtomicU64,
}
impl DynamicForwarderStats {
#[allow(dead_code)]
pub fn active_connections(&self) -> u64 {
self.active_connections.load(Ordering::Relaxed)
}
#[allow(dead_code)]
pub fn total_accepted(&self) -> u64 {
self.socks_connections_accepted.load(Ordering::Relaxed)
}
#[allow(dead_code)]
pub fn bytes_transferred(&self) -> u64 {
self.total_bytes_transferred.load(Ordering::Relaxed)
}
pub(crate) fn inc_active(&self) {
self.active_connections.fetch_add(1, Ordering::Relaxed);
}
pub(crate) fn dec_active(&self) {
self.active_connections.fetch_sub(1, Ordering::Relaxed);
}
pub(crate) fn inc_accepted(&self) {
self.socks_connections_accepted
.fetch_add(1, Ordering::Relaxed);
}
pub(crate) fn inc_failed(&self) {
self.socks_connections_failed
.fetch_add(1, Ordering::Relaxed);
}
pub(crate) fn add_bytes(&self, bytes: u64) {
self.total_bytes_transferred
.fetch_add(bytes, Ordering::Relaxed);
}
pub(crate) fn inc_socks4(&self) {
self.socks4_requests.fetch_add(1, Ordering::Relaxed);
}
pub(crate) fn inc_socks5(&self) {
self.socks5_requests.fetch_add(1, Ordering::Relaxed);
}
}