reifydb_runtime/actor/timers/
mod.rs1use std::{
20 fmt,
21 fmt::Debug,
22 sync::{
23 Arc,
24 atomic::{AtomicBool, AtomicU64, Ordering},
25 },
26};
27
28#[cfg(reifydb_target = "dst")]
29pub(crate) mod dst;
30#[cfg(reifydb_target = "native")]
31pub mod scheduler;
32#[cfg(reifydb_target = "wasi")]
33pub(crate) mod wasi;
34#[cfg(reifydb_target = "wasm")]
35pub(crate) mod wasm;
36
37#[cfg(reifydb_target = "wasi")]
38use wasi::drain_expired_timers as wasi_drain;
39
40#[derive(Clone)]
44pub struct TimerHandle {
45 id: u64,
46 cancelled: Arc<AtomicBool>,
47}
48
49impl TimerHandle {
50 pub(crate) fn new(id: u64) -> Self {
51 Self {
52 id,
53 cancelled: Arc::new(AtomicBool::new(false)),
54 }
55 }
56
57 pub fn cancel(&self) -> bool {
62 self.cancelled.compare_exchange(false, true, Ordering::SeqCst, Ordering::SeqCst).is_ok()
63 }
64
65 pub fn is_cancelled(&self) -> bool {
67 self.cancelled.load(Ordering::SeqCst)
68 }
69
70 pub fn id(&self) -> u64 {
72 self.id
73 }
74
75 pub(crate) fn cancelled_flag(&self) -> Arc<AtomicBool> {
77 self.cancelled.clone()
78 }
79}
80
81impl Debug for TimerHandle {
82 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
83 f.debug_struct("TimerHandle").field("id", &self.id).field("cancelled", &self.is_cancelled()).finish()
84 }
85}
86
87static TIMER_ID_COUNTER: AtomicU64 = AtomicU64::new(0);
89
90pub(crate) fn next_timer_id() -> u64 {
91 TIMER_ID_COUNTER.fetch_add(1, Ordering::Relaxed)
92}
93
94#[cfg(reifydb_target = "wasi")]
99pub fn drain_expired_timers() {
100 wasi_drain();
101}
102
103#[cfg(not(reifydb_target = "wasi"))]
105pub fn drain_expired_timers() {}