summaryrefslogtreecommitdiffstats
path: root/crates
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2021-10-26 21:37:49 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2021-10-26 22:13:15 +0200
commit0229cc4ef729a10b35707ca90d14a76fc729517a (patch)
tree6e993ed4454805d936d5dcefad917941f0e545d2 /crates
parent4ca63b0e66a46b076ab98f84efda05daf143cacf (diff)
downloadrebel-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.rs25
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,
};