From d4ad24ce4a9abce0cda00761de3561edbb789c27 Mon Sep 17 00:00:00 2001 From: Nils Andreas Svee Date: Sun, 22 Feb 2026 16:56:36 +0700 Subject: [PATCH] feat(util): Introduce Mutex/RwLock error handling traits --- src/baseliner.rs | 1 + src/main.rs | 1 + src/pinger.rs | 3 ++- src/ratecontroller.rs | 1 + src/reflector_selector.rs | 1 + src/util.rs | 27 +++++++++++++++++++++++++++ 6 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 src/util.rs diff --git a/src/baseliner.rs b/src/baseliner.rs index ed4b6c8..aaba06f 100644 --- a/src/baseliner.rs +++ b/src/baseliner.rs @@ -1,4 +1,5 @@ use crate::pinger::PingReply; +use crate::util::MutexExt; use crate::Config; use log::info; use std::collections::HashMap; diff --git a/src/main.rs b/src/main.rs index 1e8c12f..14aa308 100644 --- a/src/main.rs +++ b/src/main.rs @@ -10,6 +10,7 @@ mod pinger_icmp_ts; mod ratecontroller; mod reflector_selector; mod time; +mod util; use crate::baseliner::{Baseliner, ReflectorStats}; use ::log::{debug, info}; diff --git a/src/pinger.rs b/src/pinger.rs index 5d425aa..729a614 100644 --- a/src/pinger.rs +++ b/src/pinger.rs @@ -1,7 +1,8 @@ use crate::MeasurementType; use icmp_socket::socket::IcmpSocket; use icmp_socket::{IcmpSocket4, Icmpv4Packet}; -use log::{debug}; +use crate::util::RwLockExt; +use log::{debug, warn}; use std::net::{IpAddr, Ipv4Addr}; use std::sync::mpsc::Sender; use std::sync::{Arc, RwLock}; diff --git a/src/ratecontroller.rs b/src/ratecontroller.rs index 5f34879..9e66a91 100644 --- a/src/ratecontroller.rs +++ b/src/ratecontroller.rs @@ -1,5 +1,6 @@ use crate::netlink::{Netlink, NetlinkError, Qdisc}; use crate::time::Time; +use crate::util::{MutexExt, RwLockExt}; use crate::{Config, ReflectorStats}; use log::{debug, info, warn}; use rustix::thread::ClockId; diff --git a/src/reflector_selector.rs b/src/reflector_selector.rs index 18a4f22..3b0d2b1 100644 --- a/src/reflector_selector.rs +++ b/src/reflector_selector.rs @@ -1,3 +1,4 @@ +use crate::util::{MutexExt, RwLockExt}; use crate::{Config, ReflectorStats}; use log::{debug, info}; use std::collections::HashMap; diff --git a/src/util.rs b/src/util.rs new file mode 100644 index 0000000..b0d15c5 --- /dev/null +++ b/src/util.rs @@ -0,0 +1,27 @@ +use anyhow::anyhow; +use std::sync::{Mutex, MutexGuard, RwLock, RwLockReadGuard, RwLockWriteGuard}; + +pub trait MutexExt { + fn lock_anyhow(&self) -> anyhow::Result>; +} + +impl MutexExt for Mutex { + fn lock_anyhow(&self) -> anyhow::Result> { + self.lock().map_err(|e| anyhow!("mutex poisoned: {e}")) + } +} + +pub trait RwLockExt { + fn read_anyhow(&self) -> anyhow::Result>; + fn write_anyhow(&self) -> anyhow::Result>; +} + +impl RwLockExt for RwLock { + fn read_anyhow(&self) -> anyhow::Result> { + self.read().map_err(|e| anyhow!("rwlock poisoned: {e}")) + } + + fn write_anyhow(&self) -> anyhow::Result> { + self.write().map_err(|e| anyhow!("rwlock poisoned: {e}")) + } +}