summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilipp Matthias Schaefer <philipp.matthias.schaefer@posteo.de>2016-04-07 20:08:56 +0200
committerPhilipp Matthias Schaefer <philipp.matthias.schaefer@posteo.de>2016-04-21 10:15:08 +0200
commitb06432b20f152dbc8e526548fc1aa6e705ad5116 (patch)
treed6eb8844d87122a40ab9602605f9c57c6cf093de
parentfc764da2fda5799dec3d08a4ceb6dae2f41892c5 (diff)
downloadnix-b06432b20f152dbc8e526548fc1aa6e705ad5116.zip
Allow to specify signal when calling clone.
-rw-r--r--src/sched.rs6
1 files changed, 4 insertions, 2 deletions
diff --git a/src/sched.rs b/src/sched.rs
index 7216a2d8..934ce13f 100644
--- a/src/sched.rs
+++ b/src/sched.rs
@@ -1,5 +1,6 @@
use std::mem;
use std::os::unix::io::RawFd;
+use std::option::Option;
use libc::{self, c_int, c_void, c_ulong, pid_t};
use {Errno, Result};
@@ -197,17 +198,18 @@ pub fn sched_setaffinity(pid: isize, cpuset: &CpuSet) -> Result<()> {
Errno::result(res).map(drop)
}
-pub fn clone(mut cb: CloneCb, stack: &mut [u8], flags: CloneFlags) -> Result<pid_t> {
+pub fn clone(mut cb: CloneCb, stack: &mut [u8], flags: CloneFlags, signal: Option<c_int>) -> Result<pid_t> {
extern "C" fn callback(data: *mut CloneCb) -> c_int {
let cb: &mut CloneCb = unsafe { &mut *data };
(*cb)() as c_int
}
let res = unsafe {
+ let combined = flags.bits() | signal.unwrap_or(0);
let ptr = stack.as_mut_ptr().offset(stack.len() as isize);
ffi::clone(mem::transmute(callback as extern "C" fn(*mut Box<::std::ops::FnMut() -> isize>) -> i32),
ptr as *mut c_void,
- flags.bits(),
+ combined,
&mut cb)
};