use crate::{QosClass, ThreadPriority};
#[derive(Copy, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum SchedulingPolicy {
QoS {
class: QosClass,
relative_priority: libc::c_int,
},
Absolute {
priority: libc::c_int,
},
}
impl SchedulingPolicy {
pub const fn default_for(priority: ThreadPriority) -> Self {
match priority {
ThreadPriority::Background => SchedulingPolicy::QoS {
class: QosClass::Background,
relative_priority: 0,
},
ThreadPriority::Lowest => SchedulingPolicy::QoS {
class: QosClass::Utility,
relative_priority: 0,
},
ThreadPriority::BelowNormal => SchedulingPolicy::QoS {
class: QosClass::Default,
relative_priority: 0,
},
ThreadPriority::Normal => SchedulingPolicy::QoS {
class: QosClass::UserInitiated,
relative_priority: 0,
},
ThreadPriority::AboveNormal => SchedulingPolicy::QoS {
class: QosClass::UserInteractive,
relative_priority: -4,
},
ThreadPriority::Highest => SchedulingPolicy::QoS {
class: QosClass::UserInteractive,
relative_priority: 0,
},
ThreadPriority::TimeCritical => SchedulingPolicy::Absolute { priority: 47 },
}
}
}
impl std::fmt::Display for SchedulingPolicy {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
SchedulingPolicy::QoS {
class,
relative_priority,
} => {
let qos_class_str = match class {
QosClass::UserInteractive => "User Interactive",
QosClass::UserInitiated => "User Initiated",
QosClass::Utility => "Utility",
QosClass::Background => "Background",
QosClass::Default => "Default",
};
write!(
f,
"QoS Class: {}, Relative Priority: {}",
qos_class_str, relative_priority
)
}
SchedulingPolicy::Absolute { priority } => {
write!(f, "Absolute Priority: {}", priority)
}
}
}
}