1
Fork 0

Port the standard crates to PNaCl/NaCl.

This commit is contained in:
Richard Diamond 2015-10-24 20:51:34 -05:00
parent 8d86d1a4e1
commit a7d93c939a
16 changed files with 272 additions and 298 deletions

View file

@ -118,7 +118,7 @@ impl DynamicLibrary {
}
}
#[cfg(all(test, not(target_os = "ios")))]
#[cfg(all(test, not(target_os = "ios"), not(target_os = "nacl")))]
mod tests {
use super::*;
use prelude::v1::*;
@ -372,3 +372,30 @@ mod dl {
fn SetErrorMode(uMode: libc::c_uint) -> libc::c_uint;
}
}
#[cfg(target_os = "nacl")]
pub mod dl {
use ffi::OsStr;
use ptr;
use result::Result;
use result::Result::Err;
use libc;
use string::String;
use ops::FnOnce;
use option::Option;
pub fn open(_filename: Option<&OsStr>) -> Result<*mut u8, String> {
Err(format!("NaCl + Newlib doesn't impl loading shared objects"))
}
pub fn check_for_errors_in<T, F>(_f: F) -> Result<T, String>
where F: FnOnce() -> T,
{
Err(format!("NaCl doesn't support shared objects"))
}
pub unsafe fn symbol(_handle: *mut u8, _symbol: *const libc::c_char) -> *mut u8 {
ptr::null_mut()
}
pub unsafe fn close(_handle: *mut u8) { }
}

View file

@ -795,6 +795,27 @@ mod os {
pub const EXE_EXTENSION: &'static str = "exe";
}
#[cfg(all(target_os = "nacl", not(target_arch = "le32")))]
mod os {
pub const FAMILY: &'static str = "unix";
pub const OS: &'static str = "nacl";
pub const DLL_PREFIX: &'static str = "lib";
pub const DLL_SUFFIX: &'static str = ".so";
pub const DLL_EXTENSION: &'static str = "so";
pub const EXE_SUFFIX: &'static str = ".nexe";
pub const EXE_EXTENSION: &'static str = "nexe";
}
#[cfg(all(target_os = "nacl", target_arch = "le32"))]
mod os {
pub const FAMILY: &'static str = "unix";
pub const OS: &'static str = "pnacl";
pub const DLL_PREFIX: &'static str = "lib";
pub const DLL_SUFFIX: &'static str = ".pso";
pub const DLL_EXTENSION: &'static str = "pso";
pub const EXE_SUFFIX: &'static str = ".pexe";
pub const EXE_EXTENSION: &'static str = "pexe";
}
#[cfg(target_arch = "x86")]
mod arch {
pub const ARCH: &'static str = "x86";
@ -830,6 +851,11 @@ mod arch {
pub const ARCH: &'static str = "powerpc";
}
#[cfg(target_arch = "le32")]
mod arch {
pub const ARCH: &'static str = "le32";
}
#[cfg(test)]
mod tests {
use prelude::v1::*;

View file

@ -12,245 +12,36 @@
#![stable(feature = "raw_ext", since = "1.1.0")]
#[stable(feature = "raw_ext", since = "1.1.0")] pub type time_t = i32;
#[stable(feature = "raw_ext", since = "1.1.0")] pub type off_t = i32;
#[stable(feature = "raw_ext", since = "1.1.0")] pub type dev_t = u64;
#[stable(feature = "raw_ext", since = "1.1.0")] pub type ino_t = u32;
#[stable(feature = "raw_ext", since = "1.1.0")] pub type pid_t = i32;
#[stable(feature = "raw_ext", since = "1.1.0")] pub type uid_t = u32;
#[stable(feature = "raw_ext", since = "1.1.0")] pub type gid_t = u32;
#[stable(feature = "raw_ext", since = "1.1.0")] pub type mode_t = u32;
#[stable(feature = "raw_ext", since = "1.1.0")] pub type nlink_t = u32;
#[stable(feature = "raw_ext", since = "1.1.0")] pub type blksize_t = i32;
#[stable(feature = "raw_ext", since = "1.1.0")] pub type blkcnt_t = i32;
pub use self::arch::{off_t, ino_t, nlink_t, blksize_t, blkcnt_t, stat, time_t};
#[cfg(any(target_arch = "x86",
target_arch = "le32",
target_arch = "powerpc",
target_arch = "arm"))]
mod arch {
use super::{dev_t, mode_t};
use os::raw::{c_long, c_short};
use os::unix::raw::{gid_t, uid_t};
#[stable(feature = "raw_ext", since = "1.1.0")] pub type blkcnt_t = i32;
#[stable(feature = "raw_ext", since = "1.1.0")] pub type blksize_t = i32;
#[stable(feature = "raw_ext", since = "1.1.0")] pub type ino_t = u32;
#[stable(feature = "raw_ext", since = "1.1.0")] pub type nlink_t = u32;
#[stable(feature = "raw_ext", since = "1.1.0")] pub type off_t = i32;
#[stable(feature = "raw_ext", since = "1.1.0")] pub type time_t = i32;
#[repr(C)]
#[derive(Clone)]
#[stable(feature = "raw_ext", since = "1.1.0")]
pub struct stat {
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_dev: dev_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub __pad1: c_short,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_ino: ino_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_mode: mode_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_nlink: nlink_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_uid: uid_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_gid: gid_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_rdev: dev_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub __pad2: c_short,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_size: off_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_blksize: blksize_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_blocks: blkcnt_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_atime: time_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_atime_nsec: c_long,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_mtime: time_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_mtime_nsec: c_long,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_ctime: time_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_ctime_nsec: c_long,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub __unused4: c_long,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub __unused5: c_long,
}
}
#[cfg(any(target_arch = "mips",
target_arch = "mipsel"))]
mod arch {
use super::{dev_t, mode_t};
use os::raw::c_long;
use os::unix::raw::{gid_t, uid_t};
#[stable(feature = "raw_ext", since = "1.1.0")] pub type blkcnt_t = i32;
#[stable(feature = "raw_ext", since = "1.1.0")] pub type blksize_t = i32;
#[stable(feature = "raw_ext", since = "1.1.0")] pub type ino_t = u32;
#[stable(feature = "raw_ext", since = "1.1.0")] pub type nlink_t = u32;
#[stable(feature = "raw_ext", since = "1.1.0")] pub type off_t = i32;
#[stable(feature = "raw_ext", since = "1.1.0")] pub type time_t = i32;
#[repr(C)]
#[derive(Clone)]
#[stable(feature = "raw_ext", since = "1.1.0")]
pub struct stat {
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_dev: c_ulong,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_pad1: [c_long; 3],
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_ino: ino_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_mode: mode_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_nlink: nlink_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_uid: uid_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_gid: gid_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_rdev: c_ulong,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_pad2: [c_long; 2],
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_size: off_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_pad3: c_long,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_atime: time_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_atime_nsec: c_long,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_mtime: time_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_mtime_nsec: c_long,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_ctime: time_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_ctime_nsec: c_long,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_blksize: blksize_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_blocks: blkcnt_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_pad5: [c_long; 14],
}
}
#[cfg(target_arch = "aarch64")]
mod arch {
use super::{dev_t, mode_t};
use os::raw::{c_long, c_int};
use os::unix::raw::{gid_t, uid_t};
#[stable(feature = "raw_ext", since = "1.1.0")] pub type blkcnt_t = i64;
#[stable(feature = "raw_ext", since = "1.1.0")] pub type blksize_t = i32;
#[stable(feature = "raw_ext", since = "1.1.0")] pub type ino_t = u64;
#[stable(feature = "raw_ext", since = "1.1.0")] pub type nlink_t = u32;
#[stable(feature = "raw_ext", since = "1.1.0")] pub type off_t = i64;
#[stable(feature = "raw_ext", since = "1.1.0")] pub type time_t = i64;
#[repr(C)]
#[derive(Clone)]
#[stable(feature = "raw_ext", since = "1.1.0")]
pub struct stat {
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_dev: dev_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_ino: ino_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_mode: mode_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_nlink: nlink_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_uid: uid_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_gid: gid_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_rdev: dev_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub __pad1: dev_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_size: off_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_blksize: blksize_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub __pad2: c_int,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_blocks: blkcnt_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_atime: time_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_atime_nsec: c_long,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_mtime: time_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_mtime_nsec: c_long,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_ctime: time_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_ctime_nsec: c_long,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub __unused: [c_int; 2],
}
}
#[cfg(target_arch = "x86_64")]
mod arch {
use super::{dev_t, mode_t};
use os::raw::{c_long, c_int};
use os::unix::raw::{gid_t, uid_t};
#[stable(feature = "raw_ext", since = "1.1.0")] pub type blkcnt_t = i64;
#[stable(feature = "raw_ext", since = "1.1.0")] pub type blksize_t = i64;
#[stable(feature = "raw_ext", since = "1.1.0")] pub type ino_t = u64;
#[stable(feature = "raw_ext", since = "1.1.0")] pub type nlink_t = u64;
#[stable(feature = "raw_ext", since = "1.1.0")] pub type off_t = i64;
#[stable(feature = "raw_ext", since = "1.1.0")] pub type time_t = i64;
#[repr(C)]
#[derive(Clone)]
#[stable(feature = "raw_ext", since = "1.1.0")]
pub struct stat {
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_dev: dev_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_ino: ino_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_nlink: nlink_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_mode: mode_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_uid: uid_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_gid: gid_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub __pad0: c_int,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_rdev: dev_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_size: off_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_blksize: blksize_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_blocks: blkcnt_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_atime: time_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_atime_nsec: c_long,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_mtime: time_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_mtime_nsec: c_long,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_ctime: time_t,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub st_ctime_nsec: c_long,
#[stable(feature = "raw_ext", since = "1.1.0")]
pub __unused: [c_long; 3],
}
#[repr(C)]
#[derive(Copy, Clone)]
#[stable(feature = "raw_ext", since = "1.1.0")]
pub struct stat {
#[stable(feature = "raw_ext", since = "1.1.0")] pub st_dev: dev_t,
#[stable(feature = "raw_ext", since = "1.1.0")] pub st_ino: ino_t,
#[stable(feature = "raw_ext", since = "1.1.0")] pub st_mode: mode_t,
#[stable(feature = "raw_ext", since = "1.1.0")] pub st_nlink: nlink_t,
#[stable(feature = "raw_ext", since = "1.1.0")] pub st_uid: uid_t,
#[stable(feature = "raw_ext", since = "1.1.0")] pub st_gid: gid_t,
#[stable(feature = "raw_ext", since = "1.1.0")] pub st_rdev: dev_t,
#[stable(feature = "raw_ext", since = "1.1.0")] pub st_size: off_t,
#[stable(feature = "raw_ext", since = "1.1.0")] pub st_blksize: blksize_t,
#[stable(feature = "raw_ext", since = "1.1.0")] pub st_blocks: blkcnt_t,
#[stable(feature = "raw_ext", since = "1.1.0")] pub st_atime: time_t,
#[stable(feature = "raw_ext", since = "1.1.0")] pub st_atime_nsec: i64,
#[stable(feature = "raw_ext", since = "1.1.0")] pub st_mtime: time_t,
#[stable(feature = "raw_ext", since = "1.1.0")] pub st_mtime_nsec: i64,
#[stable(feature = "raw_ext", since = "1.1.0")] pub st_ctime: time_t,
#[stable(feature = "raw_ext", since = "1.1.0")] pub st_ctime_nsec: i64,
}

View file

@ -44,6 +44,14 @@ extern {}
#[link(name = "pthread")]
extern {}
// For PNaCl targets, nacl_io is a Pepper wrapper for some IO functions
// missing (ie always error) in Newlib.
#[cfg(all(target_os = "nacl", not(test)))]
#[link(name = "nacl_io", kind = "static")]
#[link(name = "c++", kind = "static")] // for `nacl_io` and EH.
#[link(name = "pthread", kind = "static")]
extern {}
#[cfg(target_os = "macos")]
#[link(name = "System")]
extern {}

View file

@ -8,6 +8,8 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#![cfg_attr(target_os = "nacl", allow(dead_code))]
use env;
use io::prelude::*;
use io;

View file

@ -24,9 +24,7 @@
#![allow(dead_code)]
#![allow(non_camel_case_types)]
pub use self::signal_os::{sigaction, siginfo, sigset_t, sigaltstack};
pub use self::signal_os::{SA_ONSTACK, SA_SIGINFO, SIGBUS, SIGSTKSZ, SIG_SETMASK};
pub use self::signal_os::*;
use libc;
#[cfg(any(target_os = "macos",
@ -52,6 +50,13 @@ pub const FIOCLEX: libc::c_ulong = 0x5451;
target_arch = "powerpc")))]
pub const FIOCLEX: libc::c_ulong = 0x6601;
#[cfg(target_env = "newlib")]
pub const FD_CLOEXEC: libc::c_int = 1;
#[cfg(target_env = "newlib")]
pub const F_GETFD: libc::c_int = 1;
#[cfg(target_env = "newlib")]
pub const F_SETFD: libc::c_int = 2;
pub const WNOHANG: libc::c_int = 1;
#[cfg(target_os = "linux")]
@ -79,6 +84,18 @@ pub struct passwd {
pub pw_dir: *mut libc::c_char,
pub pw_shell: *mut libc::c_char,
}
#[repr(C)]
#[cfg(target_env = "newlib")]
pub struct passwd {
pub pw_name: *mut libc::c_char,
pub pw_passwd: *mut libc::c_char,
pub pw_uid: libc::uid_t,
pub pw_gid: libc::gid_t,
pub pw_comment: *mut libc::c_char,
pub pw_gecos: *mut libc::c_char,
pub pw_dir: *mut libc::c_char,
pub pw_shell: *mut libc::c_char,
}
#[repr(C)]
#[cfg(any(target_os = "macos",
@ -124,7 +141,10 @@ extern {
optname: libc::c_int,
optval: *mut libc::c_void,
optlen: *mut libc::socklen_t) -> libc::c_int;
#[cfg(not(target_env = "newlib"))]
pub fn ioctl(fd: libc::c_int, req: libc::c_ulong, ...) -> libc::c_int;
#[cfg(target_env = "newlib")]
pub fn fnctl(fd: libc::c_int, req: libc::c_int, ...) -> libc::c_int;
pub fn waitpid(pid: libc::pid_t, status: *mut libc::c_int,
@ -138,6 +158,7 @@ extern {
oldact: *mut sigaction) -> libc::c_int;
#[cfg_attr(target_os = "netbsd", link_name = "__sigaltstack14")]
#[cfg(not(target_env = "newlib"))]
pub fn sigaltstack(ss: *const sigaltstack,
oss: *mut sigaltstack) -> libc::c_int;
@ -160,6 +181,8 @@ extern {
pub fn utimes(filename: *const libc::c_char,
times: *const libc::timeval) -> libc::c_int;
pub fn gai_strerror(errcode: libc::c_int) -> *const libc::c_char;
/// Newlib has this, but only for Cygwin.
#[cfg(not(target_os = "nacl"))]
pub fn setgroups(ngroups: libc::c_int,
ptr: *const libc::c_void) -> libc::c_int;
pub fn realpath(pathname: *const libc::c_char, resolved: *mut libc::c_char)
@ -325,6 +348,25 @@ mod signal_os {
}
}
/// Note: Although the signal functions are defined on NaCl, they always fail.
/// Also, this could be cfg-ed on newlib instead of nacl, but these structures
/// can differ depending on the platform, so I've played it safe here.
#[cfg(target_os = "nacl")]
mod signal_os {
use libc;
pub static SA_NOCLDSTOP: libc::c_ulong = 1;
pub static SA_SIGINFO: libc::c_ulong = 2;
pub type sigset_t = libc::c_ulong;
#[repr(C)]
pub struct sigaction {
pub sa_flags: libc::c_int,
pub sa_mask: sigset_t,
pub handler: extern fn(libc::c_int),
}
}
#[cfg(any(target_os = "macos",
target_os = "ios",
target_os = "freebsd",

View file

@ -51,12 +51,21 @@ impl FileDesc {
Ok(ret as usize)
}
#[cfg(not(target_env = "newlib"))]
pub fn set_cloexec(&self) {
unsafe {
let ret = c::ioctl(self.fd, c::FIOCLEX);
debug_assert_eq!(ret, 0);
}
}
#[cfg(target_env = "newlib")]
pub fn set_cloexec(&self) {
unsafe {
let previous = c::fnctl(self.fd, c::F_GETFD);
let ret = c::fnctl(self.fd, c::F_SETFD, previous | c::FD_CLOEXEC);
debug_assert_eq!(ret, 0);
}
}
}
impl AsInner<c_int> for FileDesc {

View file

@ -12,7 +12,6 @@
#![allow(non_camel_case_types)]
use io::{self, ErrorKind};
use libc::funcs::posix01::signal::signal;
use libc;
use num::One;
use ops::Neg;
@ -48,7 +47,9 @@ pub mod thread_local;
pub mod time;
pub mod stdio;
#[cfg(not(target_os = "nacl"))]
pub fn init() {
use libc::funcs::posix01::signal::signal;
// By default, some platforms will send a *signal* when an EPIPE error
// would otherwise be delivered. This runtime doesn't install a SIGPIPE
// handler, causing it to kill the program, which isn't exactly what we
@ -60,6 +61,8 @@ pub fn init() {
assert!(signal(libc::SIGPIPE, libc::SIG_IGN) != !0);
}
}
#[cfg(target_os = "nacl")]
pub fn init() { }
pub fn decode_error_kind(errno: i32) -> ErrorKind {
match errno as libc::c_int {

View file

@ -34,30 +34,15 @@ const TMPBUF_SZ: usize = 128;
/// Returns the platform-specific value of errno
pub fn errno() -> i32 {
#[cfg(any(target_os = "macos",
target_os = "ios",
target_os = "freebsd"))]
unsafe fn errno_location() -> *const c_int {
extern { fn __error() -> *const c_int; }
__error()
}
#[cfg(target_os = "dragonfly")]
unsafe fn errno_location() -> *const c_int {
extern { fn __dfly_error() -> *const c_int; }
__dfly_error()
}
#[cfg(any(target_os = "bitrig", target_os = "netbsd", target_os = "openbsd"))]
unsafe fn errno_location() -> *const c_int {
extern { fn __errno() -> *const c_int; }
__errno()
}
#[cfg(any(target_os = "linux", target_os = "android"))]
unsafe fn errno_location() -> *const c_int {
extern { fn __errno_location() -> *const c_int; }
__errno_location()
extern {
#[cfg_attr(any(target_os = "linux", target_os = "android"), link_name = "__errno_location")]
#[cfg_attr(any(target_os = "bitrig", target_os = "netbsd", target_os = "openbsd",
target_env = "newlib"),
link_name = "__errno")]
#[cfg_attr(target_os = "dragonfly", link_name = "__dfly_error")]
#[cfg_attr(any(target_os = "macos", target_os = "ios", target_os = "freebsd"),
link_name = "__error")]
fn errno_location() -> *const c_int;
}
unsafe {
@ -67,14 +52,9 @@ pub fn errno() -> i32 {
/// Gets a detailed string description for the given error number.
pub fn error_string(errno: i32) -> String {
#[cfg(target_os = "linux")]
extern {
#[link_name = "__xpg_strerror_r"]
fn strerror_r(errnum: c_int, buf: *mut c_char,
buflen: libc::size_t) -> c_int;
}
#[cfg(not(target_os = "linux"))]
extern {
#[cfg_attr(any(target_os = "linux", target_env = "newlib"),
link_name = "__xpg_strerror_r")]
fn strerror_r(errnum: c_int, buf: *mut c_char,
buflen: libc::size_t) -> c_int;
}
@ -361,7 +341,8 @@ pub fn args() -> Args {
target_os = "dragonfly",
target_os = "bitrig",
target_os = "netbsd",
target_os = "openbsd"))]
target_os = "openbsd",
target_os = "nacl"))]
pub fn args() -> Args {
use sys_common;
let bytes = sys_common::args::clone().unwrap_or(Vec::new());
@ -473,10 +454,12 @@ pub fn home_dir() -> Option<PathBuf> {
}).map(PathBuf::from);
#[cfg(any(target_os = "android",
target_os = "ios"))]
target_os = "ios",
target_os = "nacl"))]
unsafe fn fallback() -> Option<OsString> { None }
#[cfg(not(any(target_os = "android",
target_os = "ios")))]
target_os = "ios",
target_os = "nacl")))]
unsafe fn fallback() -> Option<OsString> {
let amt = match libc::sysconf(c::_SC_GETPW_R_SIZE_MAX) {
n if n < 0 => 512 as usize,

View file

@ -17,7 +17,6 @@ use ffi::{OsString, OsStr, CString, CStr};
use fmt;
use io::{self, Error, ErrorKind};
use libc::{self, pid_t, c_void, c_int, gid_t, uid_t};
use mem;
use ptr;
use sys::fd::FileDesc;
use sys::fs::{File, OpenOptions};
@ -315,21 +314,31 @@ impl Process {
*sys::os::environ() = envp as *const _;
}
// Reset signal handling so the child process starts in a
// standardized state. libstd ignores SIGPIPE, and signal-handling
// libraries often set a mask. Child processes inherit ignored
// signals and the signal mask from their parent, but most
// UNIX programs do not reset these things on their own, so we
// need to clean things up now to avoid confusing the program
// we're about to run.
let mut set: c::sigset_t = mem::uninitialized();
if c::sigemptyset(&mut set) != 0 ||
c::pthread_sigmask(c::SIG_SETMASK, &set, ptr::null_mut()) != 0 ||
libc::funcs::posix01::signal::signal(
libc::SIGPIPE, mem::transmute(c::SIG_DFL)
) == mem::transmute(c::SIG_ERR) {
fail(&mut output);
#[cfg(not(target_os = "nacl"))]
unsafe fn reset_signal_handling(output: &mut AnonPipe) {
use mem;
// Reset signal handling so the child process starts in a
// standardized state. libstd ignores SIGPIPE, and signal-handling
// libraries often set a mask. Child processes inherit ignored
// signals and the signal mask from their parent, but most
// UNIX programs do not reset these things on their own, so we
// need to clean things up now to avoid confusing the program
// we're about to run.
let mut set: c::sigset_t = mem::uninitialized();
if c::sigemptyset(&mut set) != 0 ||
c::pthread_sigmask(c::SIG_SETMASK, &set, ptr::null_mut()) != 0 ||
libc::funcs::posix01::signal::signal(
libc::SIGPIPE, mem::transmute(c::SIG_DFL)
) == mem::transmute(c::SIG_ERR)
{
fail(output);
}
}
#[cfg(target_os = "nacl")]
unsafe fn reset_signal_handling(_output: &mut AnonPipe) {
// NaCl has no signal support.
}
reset_signal_handling(&mut output);
let _ = libc::execvp(*argv, argv);
fail(&mut output)
@ -411,7 +420,8 @@ fn make_envp(env: Option<&HashMap<OsString, OsString>>)
fn translate_status(status: c_int) -> ExitStatus {
#![allow(non_snake_case)]
#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "nacl"))]
mod imp {
pub fn WIFEXITED(status: i32) -> bool { (status & 0xff) == 0 }
pub fn WEXITSTATUS(status: i32) -> i32 { (status >> 8) & 0xff }
@ -478,6 +488,7 @@ mod tests {
// test from being flaky we ignore it on OSX.
#[test]
#[cfg_attr(target_os = "macos", ignore)]
#[cfg_attr(target_os = "nacl", ignore)] // no signals on NaCl.
fn test_process_mask() {
unsafe {
// Test to make sure that a signal mask does not get inherited.

View file

@ -34,6 +34,7 @@ extern {
// cvars
pub fn pthread_cond_wait(cond: *mut pthread_cond_t,
lock: *mut pthread_mutex_t) -> libc::c_int;
#[cfg_attr(target_os = "nacl", link_name = "pthread_cond_timedwait_abs")]
pub fn pthread_cond_timedwait(cond: *mut pthread_cond_t,
lock: *mut pthread_mutex_t,
abstime: *const libc::timespec) -> libc::c_int;
@ -313,3 +314,61 @@ mod os {
pub const PTHREAD_MUTEX_RECURSIVE: libc::c_int = 2;
}
#[cfg(target_os = "nacl")]
mod os {
use libc;
pub type __nc_basic_thread_data = libc::c_void;
#[repr(C)]
pub struct pthread_mutex_t {
mutex_state: libc::c_int,
mutex_type: libc::c_int,
owner_thread_id: *mut __nc_basic_thread_data,
recursion_counter: libc::uint32_t,
_unused: libc::c_int,
}
#[repr(C)]
pub struct pthread_mutexattr_t {
kind: libc::c_int,
}
#[repr(C)]
pub struct pthread_cond_t {
sequence_number: libc::c_int,
_unused: libc::c_int,
}
#[repr(C)]
pub struct pthread_rwlock_t {
mutex: pthread_mutex_t,
reader_count: libc::c_int,
writers_waiting: libc::c_int,
writer_thread_id: *mut __nc_basic_thread_data,
read_possible: pthread_cond_t,
write_possible: pthread_cond_t,
}
const NC_INVALID_HANDLE: libc::c_int = -1;
const NACL_PTHREAD_ILLEGAL_THREAD_ID: *mut __nc_basic_thread_data
= 0 as *mut __nc_basic_thread_data;
pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = pthread_mutex_t {
mutex_state: 0,
mutex_type: 0,
owner_thread_id: NACL_PTHREAD_ILLEGAL_THREAD_ID,
recursion_counter: 0,
_unused: NC_INVALID_HANDLE,
};
pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t {
sequence_number: 0,
_unused: NC_INVALID_HANDLE,
};
pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t {
mutex: PTHREAD_MUTEX_INITIALIZER,
reader_count: 0,
writers_waiting: 0,
writer_thread_id: NACL_PTHREAD_ILLEGAL_THREAD_ID,
read_possible: PTHREAD_COND_INITIALIZER,
write_possible: PTHREAD_COND_INITIALIZER,
};
pub const PTHREAD_MUTEX_RECURSIVE: libc::c_int = 1;
}

View file

@ -14,6 +14,7 @@ use prelude::v1::*;
use alloc::boxed::FnBox;
use cmp;
#[cfg(not(target_env = "newlib"))]
use ffi::CString;
use io;
use libc::consts::os::posix01::PTHREAD_STACK_MIN;
@ -139,6 +140,10 @@ impl Thread {
carg.as_ptr() as *mut libc::c_void);
}
}
#[cfg(target_env = "newlib")]
pub unsafe fn set_name(_name: &str) {
// Newlib has no way to set a thread name.
}
pub fn sleep(dur: Duration) {
let mut ts = libc::timespec {

View file

@ -46,7 +46,8 @@ type pthread_key_t = ::libc::c_ulong;
target_os = "dragonfly",
target_os = "bitrig",
target_os = "netbsd",
target_os = "openbsd"))]
target_os = "openbsd",
target_os = "nacl"))]
type pthread_key_t = ::libc::c_int;
#[cfg(not(any(target_os = "macos",
@ -55,7 +56,8 @@ type pthread_key_t = ::libc::c_int;
target_os = "dragonfly",
target_os = "bitrig",
target_os = "netbsd",
target_os = "openbsd")))]
target_os = "openbsd",
target_os = "nacl")))]
type pthread_key_t = ::libc::c_uint;
extern {

View file

@ -77,16 +77,16 @@ mod inner {
// Apparently android provides this in some other library?
// Bitrig's RT extensions are in the C library, not a separate librt
// OpenBSD provide it via libc
// OpenBSD and NaCl provide it via libc
#[cfg(not(any(target_os = "android",
target_os = "bitrig",
target_os = "netbsd",
target_os = "openbsd",
target_env = "musl")))]
target_env = "musl",
target_os = "nacl")))]
#[link(name = "rt")]
extern {}
extern {
#[cfg_attr(target_os = "netbsd", link_name = "__clock_gettime50")]
fn clock_gettime(clk_id: libc::c_int, tp: *mut libc::timespec) -> libc::c_int;

View file

@ -27,6 +27,7 @@ pub enum Os {
OsBitrig,
OsNetbsd,
OsOpenbsd,
OsNaCl,
}
#[derive(PartialEq, Eq, Hash, RustcEncodable, RustcDecodable, Clone, Copy, Debug)]
@ -143,6 +144,7 @@ impl fmt::Display for Os {
OsBitrig => "bitrig".fmt(f),
OsNetbsd => "netbsd".fmt(f),
OsOpenbsd => "openbsd".fmt(f),
OsNaCl => "nacl".fmt(f),
}
}
}

View file

@ -1084,12 +1084,16 @@ impl MetricMap {
/// elimination.
///
/// This function is a no-op, and does not even read from `dummy`.
#[cfg(not(all(target_os = "nacl", target_arch = "le32")))]
pub fn black_box<T>(dummy: T) -> T {
// we need to "use" the argument in some way LLVM can't
// introspect.
unsafe {asm!("" : : "r"(&dummy))}
dummy
}
#[cfg(all(target_os = "nacl", target_arch = "le32"))]
#[inline(never)]
pub fn black_box<T>(dummy: T) -> T { dummy }
impl Bencher {