use std::env;
use std::fs::File;
use std::thread;
use std::time::Duration;
use nix::sys::resource::rlim_t;
use nix::sys::resource::setrlimit;
use nix::sys::resource::Resource;
fn set_rlimit(resource: Resource, soft_var: &str, hard_var: &str) {
let soft = env::var(soft_var).ok();
let hard = env::var(hard_var).ok();
match (soft, hard) {
(Some(soft), Some(hard)) => {
let soft = soft
.parse::<rlim_t>()
.unwrap_or_else(|_| panic!("invalid {soft_var} override"));
let hard = hard
.parse::<rlim_t>()
.unwrap_or_else(|_| panic!("invalid {hard_var} override"));
setrlimit(resource, soft, hard).unwrap_or_else(|e| {
panic!("setrlimit({resource:?}) failed: {e}");
});
}
(None, None) => {}
_ => panic!("both {soft_var} and {hard_var} must be set together"),
}
}
fn main() {
set_rlimit(
Resource::RLIMIT_CORE,
"PTOOLS_TEST_SET_RLIMIT_CORE_SOFT",
"PTOOLS_TEST_SET_RLIMIT_CORE_HARD",
);
set_rlimit(
Resource::RLIMIT_NOFILE,
"PTOOLS_TEST_SET_RLIMIT_NOFILE_SOFT",
"PTOOLS_TEST_SET_RLIMIT_NOFILE_HARD",
);
set_rlimit(
Resource::RLIMIT_STACK,
"PTOOLS_TEST_SET_RLIMIT_STACK_SOFT",
"PTOOLS_TEST_SET_RLIMIT_STACK_HARD",
);
let signal_path =
env::var("PTOOLS_TEST_READY_FILE").expect("PTOOLS_TEST_READY_FILE must be set");
File::create(signal_path).unwrap();
loop {
thread::sleep(Duration::from_millis(100));
}
}