diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2021-10-26 21:37:49 +0200 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2021-10-26 22:13:15 +0200 |
commit | 0229cc4ef729a10b35707ca90d14a76fc729517a (patch) | |
tree | 6e993ed4454805d936d5dcefad917941f0e545d2 /crates | |
parent | 4ca63b0e66a46b076ab98f84efda05daf143cacf (diff) | |
download | rebel-0229cc4ef729a10b35707ca90d14a76fc729517a.tar rebel-0229cc4ef729a10b35707ca90d14a76fc729517a.zip |
runner: add RunnerContext struct
Bundle common variables passed to different functions.
Diffstat (limited to 'crates')
-rw-r--r-- | crates/runner/src/lib.rs | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/crates/runner/src/lib.rs b/crates/runner/src/lib.rs index 54efd00..80c775d 100644 --- a/crates/runner/src/lib.rs +++ b/crates/runner/src/lib.rs @@ -35,6 +35,11 @@ pub struct Options { pub jobs: Option<usize>, } +#[derive(Debug)] +struct RunnerContext { + jobserver: Jobserver, +} + fn handle_sigchld() { loop { let status = match wait::waitpid(Pid::from_raw(-1), Some(wait::WaitPidFlag::WNOHANG)) { @@ -46,12 +51,12 @@ fn handle_sigchld() { } fn handle_request( - jobserver: &mut Jobserver, + ctx: &mut RunnerContext, socket: UnixSeqpacketConn, request_socket: UnixStream, ) -> UnixSeqpacketConn { let child = |socket| { - let token = jobserver.wait(); + let token = ctx.jobserver.wait(); let pid = unsafe { clone::spawn(None, (), |()| { drop(socket); @@ -61,7 +66,7 @@ fn handle_request( prctl::set_name(&task.label).expect("prctl(PR_SET_NAME)"); - let result = task::handle(task, jobserver); + let result = task::handle(task, &mut ctx.jobserver); bincode::serialize_into(&request_socket, &result) .expect("Failed to send task result"); drop(request_socket); @@ -70,7 +75,7 @@ fn handle_request( .expect("fork()") .0; let wait_res = wait::waitpid(pid, None); - jobserver.post(token); + ctx.jobserver.post(token); wait_res.expect("waitpid()"); }; @@ -79,10 +84,7 @@ fn handle_request( .1 } -fn handle_socket( - jobserver: &mut Jobserver, - socket: UnixSeqpacketConn, -) -> Option<UnixSeqpacketConn> { +fn handle_socket(ctx: &mut RunnerContext, socket: UnixSeqpacketConn) -> Option<UnixSeqpacketConn> { let mut fd = 0; match socket @@ -96,7 +98,7 @@ fn handle_socket( } let request_socket = unsafe { UnixStream::from_raw_fd(fd) }; - Some(handle_request(jobserver, socket, request_socket)) + Some(handle_request(ctx, socket, request_socket)) } fn runner(uid: Uid, gid: Gid, mut socket: UnixSeqpacketConn, _lockfile: File, options: &Options) { @@ -110,7 +112,8 @@ fn runner(uid: Uid, gid: Gid, mut socket: UnixSeqpacketConn, _lockfile: File, op 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"); + let jobserver = Jobserver::new(jobs).expect("Failed to initialize jobserver pipe"); + let mut ctx = RunnerContext { jobserver }; let mut signals = signal::SigSet::empty(); signals.add(signal::Signal::SIGCHLD); @@ -140,7 +143,7 @@ fn runner(uid: Uid, gid: Gid, mut socket: UnixSeqpacketConn, _lockfile: File, op .revents() .expect("Unknown events in poll() return"); if events.contains(poll::PollFlags::POLLIN) { - socket = match handle_socket(&mut jobserver, socket) { + socket = match handle_socket(&mut ctx, socket) { Some(socket) => socket, None => break, }; |