1// A "once" is a relatively simple primitive, and it's also typically provided
2// by the OS as well (see `pthread_once` or `InitOnceExecuteOnce`). The OS
3// primitives, however, tend to have surprising restrictions, such as the Unix
4// one doesn't allow an argument to be passed to the function.
5//
6// As a result, we end up implementing it ourselves in the standard library.
7// This also gives us the opportunity to optimize the implementation a bit which
8// should help the fast path on call sites.
9
10cfg_if::cfg_if! {
11 if #[cfg(any(
12 target_os = "linux",
13 target_os = "android",
14 all(target_arch = "wasm32", target_feature = "atomics"),
15 target_os = "freebsd",
16 target_os = "openbsd",
17 target_os = "dragonfly",
18 target_os = "fuchsia",
19 target_os = "hermit",
20 ))] {
21 mod futex;
22 pub use futex::{Once, OnceState};
23 } else if #[cfg(any(
24 windows,
25 target_family = "unix",
26 all(target_vendor = "fortanix", target_env = "sgx"),
27 target_os = "solid_asp3",
28 target_os = "xous",
29 ))] {
30 mod queue;
31 pub use queue::{Once, OnceState};
32 } else {
33 mod no_threads;
34 pub use no_threads::{Once, OnceState};
35 }
36}
37