cyfs_debug/check/
tracker.rs1use 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}