summaryrefslogtreecommitdiffstats
path: root/crates/runner/src/util/clone.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/runner/src/util/clone.rs')
-rw-r--r--crates/runner/src/util/clone.rs57
1 files changed, 0 insertions, 57 deletions
diff --git a/crates/runner/src/util/clone.rs b/crates/runner/src/util/clone.rs
deleted file mode 100644
index 0af9e4d..0000000
--- a/crates/runner/src/util/clone.rs
+++ /dev/null
@@ -1,57 +0,0 @@
-use std::{mem, process};
-
-use nix::{
- errno, sched,
- unistd::{self, Pid},
-};
-
-#[repr(C)]
-#[derive(Debug, Default)]
-struct CloneArgs {
- flags: u64,
- pidfd: u64,
- child_tid: u64,
- parent_tid: u64,
- exit_signal: u64,
- stack: u64,
- stack_size: u64,
- tls: u64,
-}
-
-pub unsafe fn clone(flags: sched::CloneFlags) -> nix::Result<unistd::ForkResult> {
- let mut args = CloneArgs {
- flags: flags.bits() as u64,
- exit_signal: libc::SIGCHLD as u64,
- ..CloneArgs::default()
- };
- let size = mem::size_of_val(&args) as libc::size_t;
-
- let pid = libc::syscall(libc::SYS_clone3, &mut args, size);
- if pid < 0 {
- Err(errno::Errno::last())
- } else if pid == 0 {
- Ok(unistd::ForkResult::Child)
- } else {
- Ok(unistd::ForkResult::Parent {
- child: Pid::from_raw(pid as libc::pid_t),
- })
- }
-}
-
-pub unsafe fn spawn<F>(flags: Option<sched::CloneFlags>, f: F) -> nix::Result<Pid>
-where
- F: FnOnce(),
-{
- let res = if let Some(flags) = flags {
- clone(flags)
- } else {
- unistd::fork()
- };
- match res? {
- unistd::ForkResult::Parent { child } => Ok(child),
- unistd::ForkResult::Child => {
- f();
- process::exit(0)
- }
- }
-}