Fix build on Android API levels below 21
signal(), sigemptyset(), and sigaddset() are only available as inline functions until Android API 21. liblibc already handles signal() appropriately, so drop it from c.rs; translate sigemptyset() and sigaddset() (which is only used in a test) by hand from the C inlines. We probably want to revert this commit when we bump Android API level.
This commit is contained in:
parent
cae005162d
commit
a8dbb92b47
@ -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 {
|
||||
|
@ -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::<c::sigset_t>());
|
||||
let bit = (signum - 1) as usize;
|
||||
raw[bit / 8] |= 1 << (bit % 8);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_process_mask() {
|
||||
unsafe {
|
||||
|
Loading…
x
Reference in New Issue
Block a user