| // A "once" is a relatively simple primitive, and it's also typically provided | |
| // by the OS as well (see `pthread_once` or `InitOnceExecuteOnce`). The OS | |
| // primitives, however, tend to have surprising restrictions, such as the Unix | |
| // one doesn't allow an argument to be passed to the function. | |
| // | |
| // As a result, we end up implementing it ourselves in the standard library. | |
| // This also gives us the opportunity to optimize the implementation a bit which | |
| // should help the fast path on call sites. | |
| cfg_select! { | |
| any( | |
| all(target_os = "windows", not(target_vendor="win7")), | |
| target_os = "linux", | |
| target_os = "android", | |
| all(target_family = "wasm", target_feature = "atomics"), | |
| target_os = "freebsd", | |
| target_os = "motor", | |
| target_os = "openbsd", | |
| target_os = "dragonfly", | |
| target_os = "fuchsia", | |
| target_os = "hermit", | |
| ) => { | |
| mod futex; | |
| pub use futex::{Once, OnceState}; | |
| } | |
| any( | |
| windows, | |
| target_family = "unix", | |
| all(target_vendor = "fortanix", target_env = "sgx"), | |
| target_os = "solid_asp3", | |
| target_os = "xous", | |
| ) => { | |
| mod queue; | |
| pub use queue::{Once, OnceState}; | |
| } | |
| _ => { | |
| mod no_threads; | |
| pub use no_threads::{Once, OnceState}; | |
| } | |
| } |