1 | //! Platform-dependent platform abstraction. |
2 | //! |
3 | //! The `std::sys` module is the abstracted interface through which |
4 | //! `std` talks to the underlying operating system. It has different |
5 | //! implementations for different operating system families, today |
6 | //! just Unix and Windows, and initial support for Redox. |
7 | //! |
8 | //! The centralization of platform-specific code in this module is |
9 | //! enforced by the "platform abstraction layer" tidy script in |
10 | //! `tools/tidy/src/pal.rs`. |
11 | //! |
12 | //! This module is closely related to the platform-independent system |
13 | //! integration code in `std::sys_common`. See that module's |
14 | //! documentation for details. |
15 | //! |
16 | //! In the future it would be desirable for the independent |
17 | //! implementations of this module to be extracted to their own crates |
18 | //! that `std` can link to, thus enabling their implementation |
19 | //! out-of-tree via crate replacement. Though due to the complex |
20 | //! inter-dependencies within `std` that will be a challenging goal to |
21 | //! achieve. |
22 | |
23 | #![allow (missing_debug_implementations)] |
24 | |
25 | pub mod common; |
26 | |
27 | cfg_if::cfg_if! { |
28 | if #[cfg(unix)] { |
29 | mod unix; |
30 | pub use self::unix::*; |
31 | } else if #[cfg(windows)] { |
32 | mod windows; |
33 | pub use self::windows::*; |
34 | } else if #[cfg(target_os = "solid_asp3" )] { |
35 | mod solid; |
36 | pub use self::solid::*; |
37 | } else if #[cfg(target_os = "hermit" )] { |
38 | mod hermit; |
39 | pub use self::hermit::*; |
40 | } else if #[cfg(all(target_os = "wasi" , target_env = "p2" ))] { |
41 | mod wasip2; |
42 | pub use self::wasip2::*; |
43 | } else if #[cfg(target_os = "wasi" )] { |
44 | mod wasi; |
45 | pub use self::wasi::*; |
46 | } else if #[cfg(target_family = "wasm" )] { |
47 | mod wasm; |
48 | pub use self::wasm::*; |
49 | } else if #[cfg(target_os = "xous" )] { |
50 | mod xous; |
51 | pub use self::xous::*; |
52 | } else if #[cfg(target_os = "uefi" )] { |
53 | mod uefi; |
54 | pub use self::uefi::*; |
55 | } else if #[cfg(all(target_vendor = "fortanix" , target_env = "sgx" ))] { |
56 | mod sgx; |
57 | pub use self::sgx::*; |
58 | } else if #[cfg(target_os = "teeos" )] { |
59 | mod teeos; |
60 | pub use self::teeos::*; |
61 | } else if #[cfg(target_os = "zkvm" )] { |
62 | mod zkvm; |
63 | pub use self::zkvm::*; |
64 | } else { |
65 | mod unsupported; |
66 | pub use self::unsupported::*; |
67 | } |
68 | } |
69 | |
70 | cfg_if::cfg_if! { |
71 | // Fuchsia components default to full backtrace. |
72 | if #[cfg(target_os = "fuchsia" )] { |
73 | pub const FULL_BACKTRACE_DEFAULT: bool = true; |
74 | } else { |
75 | pub const FULL_BACKTRACE_DEFAULT: bool = false; |
76 | } |
77 | } |
78 | |
79 | #[cfg (not(test))] |
80 | cfg_if::cfg_if! { |
81 | if #[cfg(target_os = "android" )] { |
82 | pub use self::android::log2f32; |
83 | pub use self::android::log2f64; |
84 | } else { |
85 | #[inline ] |
86 | pub fn log2f32(n: f32) -> f32 { |
87 | unsafe { crate::intrinsics::log2f32(n) } |
88 | } |
89 | |
90 | #[inline ] |
91 | pub fn log2f64(n: f64) -> f64 { |
92 | unsafe { crate::intrinsics::log2f64(n) } |
93 | } |
94 | } |
95 | } |
96 | |
97 | // Solaris/Illumos requires a wrapper around log, log2, and log10 functions |
98 | // because of their non-standard behavior (e.g., log(-n) returns -Inf instead |
99 | // of expected NaN). |
100 | #[cfg (not(test))] |
101 | #[cfg (any(target_os = "solaris" , target_os = "illumos" ))] |
102 | #[inline ] |
103 | pub fn log_wrapper<F: Fn(f64) -> f64>(n: f64, log_fn: F) -> f64 { |
104 | if n.is_finite() { |
105 | if n > 0.0 { |
106 | log_fn(n) |
107 | } else if n == 0.0 { |
108 | f64::NEG_INFINITY // log(0) = -Inf |
109 | } else { |
110 | f64::NAN // log(-n) = NaN |
111 | } |
112 | } else if n.is_nan() { |
113 | n // log(NaN) = NaN |
114 | } else if n > 0.0 { |
115 | n // log(Inf) = Inf |
116 | } else { |
117 | f64::NAN // log(-Inf) = NaN |
118 | } |
119 | } |
120 | |
121 | #[cfg (not(test))] |
122 | #[cfg (not(any(target_os = "solaris" , target_os = "illumos" )))] |
123 | #[inline ] |
124 | pub fn log_wrapper<F: Fn(f64) -> f64>(n: f64, log_fn: F) -> f64 { |
125 | log_fn(n) |
126 | } |
127 | |
128 | #[cfg (not(target_os = "uefi" ))] |
129 | pub type RawOsError = i32; |
130 | |