use crate::*;
use winapi::um::winnt::*;
use core::fmt::{self, Debug, Formatter};
#[derive(Clone, Copy, Default)]
#[repr(C)] pub struct CpuRateControlInformation {
control_flags: CpuRateControlFlags,
value: u32, }
structure!(@assert layout CpuRateControlInformation => JOBOBJECT_CPU_RATE_CONTROL_INFORMATION {
control_flags == ControlFlags,
value == u,
});
impl CpuRateControlInformation {
pub fn disabled() -> Self { Self {
control_flags: CpuRateControlFlags::default(),
value: 0,
}}
pub fn from_cpu_rate(cpu_rate: u32, hard_cap: bool, notify: bool) -> Self { Self {
control_flags: CPU_RATE_CONTROL_ENABLE | (hard_cap * CPU_RATE_CONTROL_HARD_CAP) | (notify * CPU_RATE_CONTROL_NOTIFY),
value: cpu_rate,
}}
pub fn from_weight(weight: u32, hard_cap: bool, notify: bool) -> Self { Self {
control_flags: CPU_RATE_CONTROL_ENABLE | (hard_cap * CPU_RATE_CONTROL_HARD_CAP) | (notify * CPU_RATE_CONTROL_NOTIFY) | CPU_RATE_CONTROL_WEIGHT_BASED,
value: weight
}}
pub fn from_min_max_rate(min_rate: u16, max_rate: u16, notify: bool) -> Self { Self {
control_flags: CPU_RATE_CONTROL_ENABLE | CPU_RATE_CONTROL_MIN_MAX_RATE | (notify * CPU_RATE_CONTROL_NOTIFY),
value: unsafe { core::mem::transmute([min_rate, max_rate]) }
}}
pub fn control_flags(&self) -> CpuRateControlFlags { self.control_flags }
pub fn is_enabled (&self) -> bool { self.control_flags & CPU_RATE_CONTROL_ENABLE != CpuRateControlFlags::default() }
pub fn is_hard_cap (&self) -> bool { self.control_flags & CPU_RATE_CONTROL_HARD_CAP != CpuRateControlFlags::default() }
pub fn is_notify (&self) -> bool { self.control_flags & CPU_RATE_CONTROL_NOTIFY != CpuRateControlFlags::default() }
pub fn cpu_rate (&self) -> Option<u32> { ((self.control_flags & !CPU_RATE_CONTROL_HARD_CAP & !CPU_RATE_CONTROL_NOTIFY) == CPU_RATE_CONTROL_ENABLE ).then_some(self.value) }
pub fn weight (&self) -> Option<u32> { ((self.control_flags & !CPU_RATE_CONTROL_HARD_CAP & !CPU_RATE_CONTROL_NOTIFY) == CPU_RATE_CONTROL_ENABLE | CPU_RATE_CONTROL_WEIGHT_BASED ).then_some(self.value) }
pub fn min_max_rate (&self) -> Option<[u16; 2]> { ((self.control_flags & !CPU_RATE_CONTROL_HARD_CAP & !CPU_RATE_CONTROL_NOTIFY) == CPU_RATE_CONTROL_ENABLE | CPU_RATE_CONTROL_MIN_MAX_RATE ).then_some(unsafe { core::mem::transmute(self.value) }) }
}
impl Debug for CpuRateControlInformation {
fn fmt(&self, fmt: &mut Formatter) -> fmt::Result {
let mut s = fmt.debug_struct("CpuRateControlInformation");
s.field("control_flags", &self.control_flags);
if let Some(cpu_rate) = self.cpu_rate() {
s.field("cpu_rate", &cpu_rate).finish()
} else if let Some(weight) = self.weight() {
s.field("weight", &weight).finish()
} else if let Some(min_max_rate) = self.min_max_rate() {
s.field("min_max_rate", &min_max_rate).finish()
} else {
s.finish_non_exhaustive()
}
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(transparent)] pub struct CpuRateControlFlagsMask(u32);
#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(transparent)] pub struct CpuRateControlFlags(u32);
flags!(impl .. for CpuRateControlFlags(u32) - CpuRateControlFlagsMask);
impl CpuRateControlFlags {
pub const unsafe fn from_unchecked(flags: u32) -> Self { Self(flags) }
}
impl Debug for CpuRateControlFlags {
fn fmt(&self, fmt: &mut Formatter) -> fmt::Result {
use winapi::um::winnt::*;
flags!(self.0, fmt, "0x{:X}", [
JOB_OBJECT_CPU_RATE_CONTROL_ENABLE,
JOB_OBJECT_CPU_RATE_CONTROL_WEIGHT_BASED,
JOB_OBJECT_CPU_RATE_CONTROL_HARD_CAP,
JOB_OBJECT_CPU_RATE_CONTROL_NOTIFY,
JOB_OBJECT_CPU_RATE_CONTROL_MIN_MAX_RATE,
])
}
}
pub const CPU_RATE_CONTROL_ENABLE : CpuRateControlFlags = CpuRateControlFlags(JOB_OBJECT_CPU_RATE_CONTROL_ENABLE);
pub const CPU_RATE_CONTROL_WEIGHT_BASED : CpuRateControlFlags = CpuRateControlFlags(JOB_OBJECT_CPU_RATE_CONTROL_WEIGHT_BASED);
pub const CPU_RATE_CONTROL_HARD_CAP : CpuRateControlFlags = CpuRateControlFlags(JOB_OBJECT_CPU_RATE_CONTROL_HARD_CAP);
pub const CPU_RATE_CONTROL_NOTIFY : CpuRateControlFlags = CpuRateControlFlags(JOB_OBJECT_CPU_RATE_CONTROL_NOTIFY);
pub const CPU_RATE_CONTROL_MIN_MAX_RATE : CpuRateControlFlags = CpuRateControlFlags(JOB_OBJECT_CPU_RATE_CONTROL_MIN_MAX_RATE);
impl job::QueryInformationJobObject for JOBOBJECT_CPU_RATE_CONTROL_INFORMATION { fn query_from(job: &job::OwnedHandle) -> Result<Self, Error> { unsafe { job::query_fixed(job, JobObjectCpuRateControlInformation) } } }
impl job::QueryInformationJobObject for job::object::CpuRateControlInformation { fn query_from(job: &job::OwnedHandle) -> Result<Self, Error> { unsafe { job::query_fixed(job, JobObjectCpuRateControlInformation) } } }
impl job::SetInformationJobObject for JOBOBJECT_CPU_RATE_CONTROL_INFORMATION { fn set_on(self, job: &job::OwnedHandle) -> Result<(), Error> { unsafe { job::set(job, JobObjectCpuRateControlInformation, &self) } } }
impl job::SetInformationJobObject for job::object::CpuRateControlInformation { fn set_on(self, job: &job::OwnedHandle) -> Result<(), Error> { unsafe { job::set(job, JobObjectCpuRateControlInformation, &self) } } }