From 0229cc4ef729a10b35707ca90d14a76fc729517a Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Tue, 26 Oct 2021 21:37:49 +0200 Subject: runner: add RunnerContext struct Bundle common variables passed to different functions. --- crates/runner/src/lib.rs | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) (limited to 'crates') 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, } +#[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 { +fn handle_socket(ctx: &mut RunnerContext, socket: UnixSeqpacketConn) -> Option { 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, }; -- cgit v1.2.3