Skip to content

Commit 7c32a24

Browse files
committed
wip
1 parent e88745b commit 7c32a24

File tree

2 files changed

+57
-15
lines changed

2 files changed

+57
-15
lines changed

backend/runner/src/hakoniwa_ext.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
use hakoniwa::{Child, ExitStatus};
2+
use nix::sys::wait::{self, WaitPidFlag, WaitStatus};
3+
4+
trait HakoniwaChildExt {
5+
fn try_wait(&self) -> Option<ExitStatus>;
6+
}
7+
8+
impl HakoniwaChildExt for Child {
9+
fn try_wait(&self) -> Option<ExitStatus> {
10+
match wait::waitpid(self.id(), Some(WaitPidFlag::WNOHANG)) {
11+
Ok(WaitStatus::StillAlive) => None,
12+
Ok(WaitStatus::Exited(_, code)) => Some(ExitStatus {
13+
code,
14+
// Mario reference
15+
reason: "Life is good".to_owned(),
16+
exit_code: None,
17+
rusage: None,
18+
}),
19+
Ok(WaitStatus::Signaled(_, signal, _) | WaitStatus::Stopped(_, signal)) => Some(ExitStatus {
20+
code: signal as i32,
21+
reason: signal.as_str().to_owned(),
22+
exit_code: None,
23+
rusage: None,
24+
}),
25+
Ok(WaitStatus::Continued(_)) => None,
26+
}
27+
}
28+
}

backend/runner/src/lib.rs

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
pub mod error;
2+
pub mod hakoniwa_ext;
23

34
use hakoniwa::{Child, Command, Container, ExitStatus, Output};
45
use nix::libc::pid_t;
@@ -138,24 +139,37 @@ impl Runner {
138139
let stderr = tokio::spawn(stderr_fn(stderr));
139140

140141
let child_pid = Pid::from_raw(child.id() as pid_t);
141-
let abort_task = tokio::spawn(async move {
142-
let Some(abort) = abort else {
143-
return;
144-
};
145-
146-
_ = abort.await;
147-
148-
println!("[[[[KILL]]]]");
149-
_ = signal::kill(child_pid, Signal::SIGKILL);
150-
});
151-
152-
let status = tokio::task::spawn_blocking(move || child.wait());
142+
let status = if let Some(abort) = abort {
143+
tokio::spawn(async move {
144+
loop {
145+
tokio::select! {
146+
_ = abort => {
147+
println!("[[[[KILL]]]]");
148+
_ = signal::kill(child_pid, Signal::SIGKILL);
149+
return Ok(ExitStatus {
150+
code: 137,
151+
reason: "Aborted".to_owned(),
152+
exit_code: None,
153+
rusage: None,
154+
});
155+
},
156+
else => {
157+
return Ok(ExitStatus {
158+
code: 137,
159+
reason: "Aborted".to_owned(),
160+
exit_code: None,
161+
rusage: None,
162+
});
163+
}
164+
}
165+
}
166+
})
167+
} else {
168+
tokio::task::spawn_blocking(move || child.wait())
169+
};
153170

154171
let (status, stdout, stderr) = tokio::join!(status, stdout, stderr);
155172

156-
// Cancel abort task
157-
abort_task.abort();
158-
159173
let status = status
160174
.inspect_err(|err| eprintln!("Join error: {err}"))
161175
.map(|o| o.inspect_err(|err| eprintln!("Join error: {err}")).ok())

0 commit comments

Comments
 (0)