#![cfg(target_os = "linux")]
use std::sync::Arc;
use std::sync::atomic::{AtomicU64, Ordering};
use std::time::Duration;
use taktora_executor::{ControlFlow, Executor, item_with_triggers};
#[test]
fn dispatch_thread_runs_with_one_microsecond_timer_slack() {
let mut exec = Executor::builder().worker_threads(0).build().unwrap();
let slack = Arc::new(AtomicU64::new(0));
let s = Arc::clone(&slack);
exec.add(item_with_triggers(
|d| {
d.interval(Duration::from_millis(1));
Ok(())
},
move |_| {
#[allow(unsafe_code)]
let tid = unsafe { libc::gettid() };
let raw = std::fs::read_to_string(format!("/proc/{tid}/timerslack_ns"))
.expect("read timerslack_ns");
s.store(
raw.trim().parse().expect("parse timerslack_ns"),
Ordering::SeqCst,
);
Ok(ControlFlow::Continue)
},
))
.unwrap();
exec.run_n(1).unwrap();
assert_eq!(
slack.load(Ordering::SeqCst),
1_000,
"dispatch thread must run with 1 µs timer slack (kernel default 50 µs \
costs ~50 µs/cycle Legacy drift under SCHED_OTHER)"
);
}