#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[derive(Deserialize, Serialize)]
#[serde(deny_unknown_fields)]
pub enum ResourceLimit
{
Finite(u64),
Infinite,
}
impl ResourceLimit
{
const Infinity: rlim_t = RLIM_INFINITY as rlim_t;
pub fn maximum_number_of_open_file_descriptors(proc_path: &ProcPath) -> Result<ResourceLimit, io::Error>
{
Self::nr_open_file_path(proc_path).read_value().map(ResourceLimit::Finite)
}
#[inline(always)]
pub fn set_maximum_number_of_open_file_descriptors(proc_path: &ProcPath, value: u64) -> io::Result<()>
{
assert_effective_user_id_is_root("write to /proc/sys/fs/nr_open");
let file_path = Self::nr_open_file_path(proc_path);
if file_path.exists()
{
file_path.write_value(UnpaddedDecimalInteger(value))
}
else
{
Ok(())
}
}
#[inline(always)]
fn nr_open_file_path(proc_path: &ProcPath) -> PathBuf
{
proc_path.sys_fs_file_path("nr_open")
}
#[inline(always)]
pub fn value(&self) -> u64
{
use self::ResourceLimit::*;
match *self
{
Finite(limit) => limit,
Infinite => u64::MAX,
}
}
#[inline(always)]
pub fn convert(value: rlim_t) -> ResourceLimit
{
use self::ResourceLimit::*;
if value >= Self::Infinity
{
Infinite
}
else
{
Finite(value)
}
}
#[inline(always)]
pub fn unwrap(&self) -> rlim_t
{
use self::ResourceLimit::*;
match *self
{
Finite(limit) =>
{
assert!(limit < Self::Infinity, "limit '{}' equals or exceeds Infinity '{}'", limit, Self::Infinity);
limit
},
Infinite => Self::Infinity
}
}
#[inline(always)]
pub fn is_finite(&self) -> bool
{
match *self
{
ResourceLimit::Finite(_) => true,
_ => false,
}
}
#[inline(always)]
pub fn is_infinite(&self) -> bool
{
match *self
{
ResourceLimit::Infinite => true,
_ => false,
}
}
}