diff options
Diffstat (limited to 'crates/runner/src/lib.rs')
-rw-r--r-- | crates/runner/src/lib.rs | 28 |
1 files changed, 13 insertions, 15 deletions
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<UnixSeqpacketConn> { 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"); } |