diff --git a/src/libstd/sys/unix/c.rs b/src/libstd/sys/unix/c.rs index 431312b3d8f..99a6731c57d 100644 --- a/src/libstd/sys/unix/c.rs +++ b/src/libstd/sys/unix/c.rs @@ -135,7 +135,9 @@ extern { pub fn sigaltstack(ss: *const sigaltstack, oss: *mut sigaltstack) -> libc::c_int; + #[cfg(not(target_os = "android"))] pub fn sigemptyset(set: *mut sigset_t) -> libc::c_int; + pub fn pthread_sigmask(how: libc::c_int, set: *const sigset_t, oldset: *mut sigset_t) -> libc::c_int; @@ -155,6 +157,14 @@ extern { -> *mut libc::c_char; } +// Ugh. This is only available as an inline until Android API 21. +#[cfg(target_os = "android")] +pub unsafe fn sigemptyset(set: *mut sigset_t) -> libc::c_int { + use intrinsics; + intrinsics::write_bytes(set, 0, 1); + return 0; +} + #[cfg(any(target_os = "linux", target_os = "android"))] mod signal_os { diff --git a/src/libstd/sys/unix/process.rs b/src/libstd/sys/unix/process.rs index 85ce8d79880..695d0ddfaaf 100644 --- a/src/libstd/sys/unix/process.rs +++ b/src/libstd/sys/unix/process.rs @@ -446,12 +446,22 @@ mod tests { use mem; use ptr; use libc; + use slice; use sys::{self, c, cvt, pipe}; + #[cfg(not(target_os = "android"))] extern { fn sigaddset(set: *mut c::sigset_t, signum: libc::c_int) -> libc::c_int; } + #[cfg(target_os = "android")] + unsafe fn sigaddset(set: *mut c::sigset_t, signum: libc::c_int) -> libc::c_int { + let raw = slice::from_raw_parts_mut(set as *mut u8, mem::size_of::()); + let bit = (signum - 1) as usize; + raw[bit / 8] |= 1 << (bit % 8); + return 0; + } + #[test] fn test_process_mask() { unsafe {