1 #![allow(dead_code, missing_docs, nonstandard_style)]
3 use io::{self, ErrorKind};
6 pub use self::rand::hashmap_random_keys;
8 #[path = "../unix/alloc.rs"]
11 #[cfg(feature = "backtrace")]
17 pub mod fast_thread_local;
30 pub mod stack_overflow;
40 pub fn decode_error_kind(errno: i32) -> ErrorKind {
42 syscall::ECONNREFUSED => ErrorKind::ConnectionRefused,
43 syscall::ECONNRESET => ErrorKind::ConnectionReset,
44 syscall::EPERM | syscall::EACCES => ErrorKind::PermissionDenied,
45 syscall::EPIPE => ErrorKind::BrokenPipe,
46 syscall::ENOTCONN => ErrorKind::NotConnected,
47 syscall::ECONNABORTED => ErrorKind::ConnectionAborted,
48 syscall::EADDRNOTAVAIL => ErrorKind::AddrNotAvailable,
49 syscall::EADDRINUSE => ErrorKind::AddrInUse,
50 syscall::ENOENT => ErrorKind::NotFound,
51 syscall::EINTR => ErrorKind::Interrupted,
52 syscall::EINVAL => ErrorKind::InvalidInput,
53 syscall::ETIMEDOUT => ErrorKind::TimedOut,
54 syscall::EEXIST => ErrorKind::AlreadyExists,
56 // These two constants can have the same value on some systems,
57 // but different values on others, so we can't use a match
59 x if x == syscall::EAGAIN || x == syscall::EWOULDBLOCK =>
60 ErrorKind::WouldBlock,
62 _ => ErrorKind::Other,
66 pub fn cvt(result: Result<usize, syscall::Error>) -> io::Result<usize> {
67 result.map_err(|err| io::Error::from_raw_os_error(err.errno))
71 pub trait IsMinusOne {
72 fn is_minus_one(&self) -> bool;
75 macro_rules! impl_is_minus_one {
76 ($($t:ident)*) => ($(impl IsMinusOne for $t {
77 fn is_minus_one(&self) -> bool {
83 impl_is_minus_one! { i8 i16 i32 i64 isize }
85 pub fn cvt_libc<T: IsMinusOne>(t: T) -> io::Result<T> {
87 Err(io::Error::last_os_error())
93 /// On Redox, use an illegal instruction to abort
94 pub unsafe fn abort_internal() -> ! {
95 ::core::intrinsics::abort();