#[derive(Debug, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash)]
#[derive(Deserialize, Serialize)]
#[serde(default, deny_unknown_fields)]
pub struct ProcessIoPriorityConfiguration
{
pub all_other_processes_for_current_user: Option<IoPriority>,
pub all_other_processes_in_process_group: Option<IoPriority>,
pub current_process_priority: Option<IoPriority>,
}
impl Default for ProcessIoPriorityConfiguration
{
#[inline(always)]
fn default() -> Self
{
use self::IoPriority::*;
Self
{
all_other_processes_for_current_user: Some(Idle),
all_other_processes_in_process_group: Some(Idle),
current_process_priority: Some(RealTime(RealTimeOrBestEffortIoPriorityLevel::_0)),
}
}
}
impl ProcessIoPriorityConfiguration
{
#[inline(always)]
pub fn configure(&self) -> Result<(), ProcessIoPriorityConfigurationError>
{
#[inline(always)]
fn set_io_priority_value(nice_value: Option<IoPriority>, function: impl FnOnce(IoPriority) -> Result<(), bool>, error: impl FnOnce(bool) -> ProcessIoPriorityConfigurationError) -> Result<(), ProcessIoPriorityConfigurationError>
{
if let Some(nice_value) = nice_value
{
function(nice_value).map_err(|cause| error(cause))
}
else
{
Ok(())
}
}
use self::ProcessIoPriorityConfigurationError::*;
set_io_priority_value(self.all_other_processes_for_current_user, |io_priority| io_priority.set_for_user(UserIdentifier::default()), CouldNotSetCurrentUserIoPriority)?;
set_io_priority_value(self.all_other_processes_in_process_group, |io_priority| io_priority.set_for_process_group(ProcessGroupIdentifierChoice::Current), CouldNotSetCurrentProcessGroupIoPriority)?;
set_io_priority_value(self.current_process_priority, |io_priority| io_priority.set_for_process(ProcessIdentifierChoice::Current), CouldNotSetCurrentProcessIoPriority)?;
Ok(())
}
}