summaryrefslogtreecommitdiffstats
path: root/crates/runner
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2021-10-26 21:31:18 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2021-10-26 22:12:32 +0200
commit800383146af49b4adfd6ecb6d32c6eef4cb27763 (patch)
tree1cf35acea25d86d7a14a8a03625c5cdfc347e614 /crates/runner
parentae79ea1276f56872da590dd611c7b12b4db67c27 (diff)
downloadrebel-800383146af49b4adfd6ecb6d32c6eef4cb27763.tar
rebel-800383146af49b4adfd6ecb6d32c6eef4cb27763.zip
runner: pass jobserver to task handler as reference
Some code simplification.
Diffstat (limited to 'crates/runner')
-rw-r--r--crates/runner/src/lib.rs28
-rw-r--r--crates/runner/src/task.rs6
2 files changed, 16 insertions, 18 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");
}
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<HashMap<String
Ok(ret)
}
-fn run_task(input_hash: &InputHash, task: &Task, mut jobserver: Jobserver) -> 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<LayerHash>) -> Result<()> {
fn run_and_hash_task(
input_hash: &InputHash,
task: &Task,
- jobserver: Jobserver,
+ jobserver: &mut Jobserver,
) -> Result<TaskOutput> {
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<TaskOutput> {
+pub fn handle(task: Task, jobserver: &mut Jobserver) -> Result<TaskOutput> {
let input_hash = input_hash(&task);
// TODO: We should not hold a job token while waiting on the lock