From 800383146af49b4adfd6ecb6d32c6eef4cb27763 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Tue, 26 Oct 2021 21:31:18 +0200 Subject: runner: pass jobserver to task handler as reference Some code simplification. --- crates/runner/src/lib.rs | 28 +++++++++++++--------------- crates/runner/src/task.rs | 6 +++--- 2 files changed, 16 insertions(+), 18 deletions(-) (limited to 'crates') diff --git a/crates/runner/src/lib.rs b/crates/runner/src/lib.rs index 8104daa..ae56981 100644 --- a/crates/runner/src/lib.rs +++ b/crates/runner/src/lib.rs @@ -46,11 +46,11 @@ fn handle_sigchld() { } fn handle_request( - jobserver: Jobserver, + jobserver: &mut Jobserver, socket: UnixSeqpacketConn, request_socket: UnixStream, -) -> (Jobserver, UnixSeqpacketConn) { - let child = |(mut jobserver, socket): (Jobserver, UnixSeqpacketConn)| { +) -> UnixSeqpacketConn { + let child = |socket| { drop(socket); let task: Task = @@ -59,29 +59,30 @@ fn handle_request( prctl::set_name(&task.label).expect("prctl(PR_SET_NAME)"); let token = jobserver.wait(); - let (pid, mut jobserver) = unsafe { - clone::spawn(None, jobserver, |jobserver| { + let pid = unsafe { + clone::spawn(None, (), |()| { let result = task::handle(task, jobserver); bincode::serialize_into(&request_socket, &result) .expect("Failed to send task result"); drop(request_socket); }) } - .expect("fork()"); + .expect("fork()") + .0; let wait_res = wait::waitpid(pid, None); jobserver.post(token); wait_res.expect("waitpid()"); }; - unsafe { clone::spawn(None, (jobserver, socket), child) } + unsafe { clone::spawn(None, socket, child) } .expect("fork()") .1 } fn handle_socket( - jobserver: Jobserver, + jobserver: &mut Jobserver, socket: UnixSeqpacketConn, -) -> Option<(Jobserver, UnixSeqpacketConn)> { +) -> Option { let mut fd = 0; match socket @@ -139,13 +140,10 @@ 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) { - match handle_socket(jobserver, socket) { - Some((jobserver_ret, socket_ret)) => { - jobserver = jobserver_ret; - socket = socket_ret; - } + socket = match handle_socket(&mut jobserver, socket) { + Some(socket) => socket, None => break, - } + }; } else if events.intersects(!poll::PollFlags::POLLIN) { panic!("Unexpected error status for socket file descriptor"); } diff --git a/crates/runner/src/task.rs b/crates/runner/src/task.rs index ff27399..6c52be2 100644 --- a/crates/runner/src/task.rs +++ b/crates/runner/src/task.rs @@ -237,7 +237,7 @@ fn collect_outputs(input_hash: &InputHash, task: &Task) -> Result Result<()> { +fn run_task(input_hash: &InputHash, task: &Task, jobserver: &mut Jobserver) -> Result<()> { let _workdir_mount = init_task(input_hash, task).context("Failed to initialize task")?; unpack_dependencies(input_hash, task).context("Failed to unpack dependencies")?; let _rootfs_mount = init_task_rootfs(input_hash).context("Failed to initialize task rootfs")?; @@ -392,7 +392,7 @@ fn move_layer(input_hash: &InputHash, hash: &Option) -> Result<()> { fn run_and_hash_task( input_hash: &InputHash, task: &Task, - jobserver: Jobserver, + jobserver: &mut Jobserver, ) -> Result { run_task(input_hash, task, jobserver)?; @@ -430,7 +430,7 @@ fn save_cached(input_hash: &InputHash, output: &TaskOutput) -> Result<()> { Ok(()) } -pub fn handle(task: Task, jobserver: Jobserver) -> Result { +pub fn handle(task: Task, jobserver: &mut Jobserver) -> Result { let input_hash = input_hash(&task); // TODO: We should not hold a job token while waiting on the lock -- cgit v1.2.3