1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// "once" 是一个相对简单的原语,通常也由操作系统提供 (请参见 `pthread_once` 或 `InitOnceExecuteOnce`)。
// 但是,操作系统原语往往具有令人惊讶的限制,例如 Unix 不允许将参数传递给函数。
//
//
// 结果,我们最终在标准库中自己实现了它。
// 这也为我们提供了优化实现的机会,这将有助于在调用站点上实现快速路径。
//
//

cfg_if::cfg_if! {
    if #[cfg(any(
        target_os = "linux",
        target_os = "android",
        all(target_arch = "wasm32", target_feature = "atomics"),
        target_os = "freebsd",
        target_os = "openbsd",
        target_os = "dragonfly",
        target_os = "fuchsia",
        target_os = "hermit",
    ))] {
        mod futex;
        pub use futex::{Once, OnceState};
    } else if #[cfg(any(
        windows,
        target_family = "unix",
        all(target_vendor = "fortanix", target_env = "sgx"),
        target_os = "solid_asp3",
    ))] {
        mod queue;
        pub use queue::{Once, OnceState};
    } else {
        pub use crate::sys::once::{Once, OnceState};
    }
}