Skip to main content

dope_runtime/executor/
runtime_tuning.rs

1use std::time::{Duration, Instant};
2
3use dope_core::driver::DriverConfig;
4use dope_core::profile::Profile;
5
6#[derive(Clone, Copy, Debug, PartialEq, Eq)]
7pub(crate) struct IdleParkPolicy {
8    active_window: Duration,
9    active_park_timeout: Duration,
10    idle_park_timeout: Duration,
11}
12
13impl IdleParkPolicy {
14    pub(super) fn from_profile<P: Profile>() -> Self {
15        Self {
16            active_window: P::ACTIVE_WINDOW,
17            active_park_timeout: P::ACTIVE_PARK_TIMEOUT,
18            idle_park_timeout: P::IDLE_PARK_TIMEOUT,
19        }
20    }
21
22    pub(super) fn timeout_for(
23        &self,
24        now: Instant,
25        next_deadline: Option<Instant>,
26        shutdown_deadline: Option<Instant>,
27        last_activity: Instant,
28    ) -> Option<Duration> {
29        if let Some(deadline) = shutdown_deadline
30            && now >= deadline
31        {
32            return None;
33        }
34
35        let base = if now.saturating_duration_since(last_activity) <= self.active_window {
36            self.active_park_timeout
37        } else {
38            self.idle_park_timeout
39        };
40
41        let mut timeout = next_deadline
42            .map(|d| d.saturating_duration_since(now))
43            .unwrap_or(base);
44
45        if let Some(deadline) = shutdown_deadline {
46            timeout = timeout.min(deadline.saturating_duration_since(now));
47        }
48
49        if timeout.is_zero() {
50            Some(Duration::from_micros(1))
51        } else {
52            Some(timeout)
53        }
54    }
55}
56
57#[derive(Clone, Copy, Debug, PartialEq, Eq)]
58pub struct RuntimeTuning<C: DriverConfig> {
59    pub(crate) driver: C,
60    pub(crate) idle_park_policy: IdleParkPolicy,
61}
62
63impl<C: DriverConfig> RuntimeTuning<C> {
64    pub fn for_profile<P: Profile>() -> Self {
65        Self {
66            driver: <C as DriverConfig>::for_profile::<P>(),
67            idle_park_policy: IdleParkPolicy::from_profile::<P>(),
68        }
69    }
70}