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