cyfs_debug/check/
tracker.rs

1use std::fmt;
2use std::sync::Mutex;
3use std::time::Duration;
4
5lazy_static::lazy_static! {
6    static ref TIMER: Mutex<timer::Timer> = {
7        warn!("tracker timer manager launched...");
8        Mutex::new(timer::Timer::new())
9    };
10}
11
12#[derive(Clone, Eq, PartialEq)]
13pub enum TimeoutTrackerCategory {
14    EnterLock,
15    Lock,
16    Scope,
17}
18
19impl fmt::Display for TimeoutTrackerCategory {
20    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
21        let v = match *self {
22            TimeoutTrackerCategory::EnterLock => "enter_lock",
23            TimeoutTrackerCategory::Lock => "lock",
24            TimeoutTrackerCategory::Scope => "scope",
25        };
26
27        write!(fmt, "{}", v)
28    }
29}
30
31pub struct TimeoutTracker {
32    categroy: TimeoutTrackerCategory,
33    name: String,
34    timer: timer::Guard,
35}
36
37impl TimeoutTracker {
38    pub fn new_scope(name: &str, dur: Duration) -> Self {
39        Self::new(TimeoutTrackerCategory::Scope, name, dur)
40    }
41
42    pub fn new(categroy: TimeoutTrackerCategory, name: impl Into<String>, dur: Duration) -> Self {
43        let categroy1 = categroy.clone();
44        let name = name.into();
45        let dur = chrono::Duration::from_std(dur).unwrap();
46        let name1 = name.clone();
47        let timer = TIMER
48            .lock()
49            .unwrap()
50            .schedule_with_delay(dur.clone(), move || {
51                error!(
52                    "tracker during extend limit: categroy={}, name={}, dur={}",
53                    categroy1, name1, dur
54                );
55            });
56
57        Self {
58            categroy,
59            name,
60            timer,
61        }
62    }
63}
64
65impl Drop for TimeoutTracker {
66    fn drop(&mut self) {
67        #[cfg(feature = "trace")]
68        trace!("tracker leave: category={}, name={}",self.categroy,self.name);
69    }
70}
71
72#[allow(dead_code)]
73#[cfg(feature = "check")]
74#[macro_export]
75macro_rules! scope_tracker {
76    ($dur:expr) => {
77        let tracker =
78            cyfs_debug::TimeoutTracker::new_scope(&format!("{}:{}", file!(), line!()), $dur);
79    };
80}
81
82#[allow(dead_code)]
83#[cfg(not(feature = "check"))]
84#[macro_export]
85macro_rules! scope_tracker {
86    ($dur:expr) => {};
87}