dope_runtime/executor/
runtime_tuning.rs1use 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}