diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2021-10-25 23:29:30 +0200 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2021-10-25 23:37:21 +0200 |
commit | 23a62b06d697f2beb8350347de9ea4241f1430b5 (patch) | |
tree | 4fe583dc8ee1895e3a679a7fc82de40443cd51a2 /crates/runner | |
parent | ef2e197f1343d3c99b1896b7461e291baad8988e (diff) | |
download | rebel-23a62b06d697f2beb8350347de9ea4241f1430b5.tar rebel-23a62b06d697f2beb8350347de9ea4241f1430b5.zip |
Allow to set the maximum number of jobs on the command line
Diffstat (limited to 'crates/runner')
-rw-r--r-- | crates/runner/src/lib.rs | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/crates/runner/src/lib.rs b/crates/runner/src/lib.rs index 45366f3..af1e2a7 100644 --- a/crates/runner/src/lib.rs +++ b/crates/runner/src/lib.rs @@ -26,6 +26,11 @@ use self::{ util::{clone, unix}, }; +#[derive(Debug, Clone)] +pub struct Options { + pub jobs: Option<usize>, +} + #[derive(Debug, Deserialize, Serialize)] enum Message { Request(Task, ipc::IpcSender<Result<TaskOutput>>), @@ -61,9 +66,11 @@ fn handle_request( .1 } -fn runner_loop(mut channel: ipc::IpcReceiver<Message>) { - let nproc = unix::nproc().expect("Failed to get number of available CPUs"); - let mut jobserver = Jobserver::new(nproc).expect("Failed to initialize jobserver pipe"); +fn runner_loop(mut channel: ipc::IpcReceiver<Message>, options: &Options) { + let jobs = options + .jobs + .unwrap_or_else(|| unix::nproc().expect("Failed to get number of available CPUs")); + let mut jobserver = Jobserver::new(jobs).expect("Failed to initialize jobserver pipe"); while let Ok(msg) = channel.recv() { match msg { @@ -76,7 +83,13 @@ fn runner_loop(mut channel: ipc::IpcReceiver<Message>) { } } -fn runner(uid: Uid, gid: Gid, channel: ipc::IpcReceiver<Message>, _lockfile: File) { +fn runner( + uid: Uid, + gid: Gid, + channel: ipc::IpcReceiver<Message>, + _lockfile: File, + options: &Options, +) { ns::mount_proc(); ns::setup_userns(Uid::from_raw(0), Gid::from_raw(0), uid, gid); @@ -87,7 +100,7 @@ fn runner(uid: Uid, gid: Gid, channel: ipc::IpcReceiver<Message>, _lockfile: Fil let msg_handler = unsafe { clone::spawn(None, (), |()| { signal::signal(signal::Signal::SIGCHLD, signal::SigHandler::SigIgn).unwrap(); - runner_loop(channel); + runner_loop(channel, options); }) } .expect("fork()") @@ -109,7 +122,7 @@ impl Runner { /// Creates a new container runner /// /// Unsafe: Do not call in multithreaded processes - pub unsafe fn new() -> Result<Self> { + pub unsafe fn new(options: &Options) -> Result<Self> { let lockfile = Runner::lock()?; let uid = unistd::geteuid(); @@ -122,7 +135,7 @@ impl Runner { (tx, rx), |(tx, rx)| { drop(tx); - runner(uid, gid, rx, lockfile); + runner(uid, gid, rx, lockfile, options); }, ) .expect("clone()") |