core.stdc.stdatomic
A D implementation of the C stdatomic.h header.
Note
If it compiles it should produce similar assembly to the system C toolchainand should not introduce when optimizing unnecessary behaviors, if you do not care about this guarantee use the _impl suffix.
Note
The D shared type qualifier is the closest to the _Atomic type qualifier from C. It may be changed from shared in the future.Note
Fail memory order is currently ignored due to limitations with internal implementation of atomics.Copyright
Copyright Richard (Rikki) Andrew Cattermole 2023.
var ATOMIC_FLAG_INIT
alias atomic_bool atomic_char atomic_char16_t atomic_char32_t atomic_char8_t atomic_int atomic_int_fast16_t atomic_int_fast32_t atomic_int_fast64_t atomic_int_fast8_t atomic_int_least16_t atomic_int_least32_t atomic_int_least64_t atomic_int_least8_t atomic_intmax_t atomic_intptr_t atomic_llong atomic_long atomic_ptrdiff_t atomic_schar atomic_short atomic_size_t atomic_uchar atomic_uint atomic_uint_fast16_t atomic_uint_fast32_t atomic_uint_fast64_t atomic_uint_fast8_t atomic_uint_least16_t atomic_uint_least32_t atomic_uint_least64_t atomic_uint_least8_t atomic_uintmax_t atomic_uintptr_t atomic_ullong atomic_ulong atomic_ushort atomic_wchar_t
enum memory_order
struct atomic_flag
fn atomic_compare_exchange_strong_explicit_impl atomic_compare_exchange_strong_impl atomic_compare_exchange_weak_explicit_impl atomic_compare_exchange_weak_impl atomic_exchange_explicit_impl atomic_exchange_impl atomic_fetch_add_explicit_impl atomic_fetch_add_impl atomic_fetch_and_explicit_impl atomic_fetch_and_impl atomic_fetch_op atomic_fetch_or_explicit_impl atomic_fetch_or_impl atomic_fetch_sub_explicit_impl atomic_fetch_sub_impl atomic_fetch_xor_explicit_impl atomic_fetch_xor_impl atomic_flag_clear_explicit_impl atomic_flag_clear_impl atomic_flag_test_and_set_explicit_impl atomic_flag_test_and_set_impl atomic_init atomic_is_lock_free atomic_load_explicit_impl atomic_load_impl atomic_signal_fence_impl atomic_store_explicit_impl atomic_store_impl atomic_thread_fence_impl kill_dependency
Types 40
enummemory_order
memory_order_relaxed = MemoryOrder.rawNo ordering provided
memory_order_consume = MemoryOrder.acqAs per cppreference.com circa 2015 no compiler supports consume memory order and in practice it devolves to acquire.
memory_order_acquire = MemoryOrder.acqPrevent reordering before operation
memory_order_release = MemoryOrder.relPrevent reordering after operation
memory_order_acq_rel = MemoryOrder.acq_relPrevent reordering before and after operation
memory_order_seq_cst = MemoryOrder.seqPrevent reordering before for read operations and after for writes.
structatomic_flag
Guaranteed to be a atomic boolean type
Fields
private bool baliasatomic_bool = shared(bool)
aliasatomic_char = shared(char)
aliasatomic_schar = shared(byte)
aliasatomic_uchar = shared(ubyte)
aliasatomic_short = shared(short)
aliasatomic_ushort = shared(ushort)
aliasatomic_int = shared(int)
aliasatomic_uint = shared(uint)
aliasatomic_long = shared(c_long)
aliasatomic_ulong = shared(c_ulong)
aliasatomic_llong = shared(long)
aliasatomic_ullong = shared(ulong)
aliasatomic_char8_t = shared(char)
aliasatomic_char16_t = shared(wchar)
aliasatomic_char32_t = shared(dchar)
aliasatomic_wchar_t = shared(wchar_t)
aliasatomic_int_least8_t = shared(int_least8_t)
aliasatomic_uint_least8_t = shared(uint_least8_t)
aliasatomic_int_least16_t = shared(int_least16_t)
aliasatomic_uint_least16_t = shared(uint_least16_t)
aliasatomic_int_least32_t = shared(int_least32_t)
aliasatomic_uint_least32_t = shared(uint_least32_t)
aliasatomic_int_least64_t = shared(int_least64_t)
aliasatomic_uint_least64_t = shared(uint_least64_t)
aliasatomic_int_fast8_t = shared(int_fast8_t)
aliasatomic_uint_fast8_t = shared(uint_fast8_t)
aliasatomic_int_fast16_t = shared(int_fast16_t)
aliasatomic_uint_fast16_t = shared(uint_fast16_t)
aliasatomic_int_fast32_t = shared(int_fast32_t)
aliasatomic_uint_fast32_t = shared(uint_fast32_t)
aliasatomic_int_fast64_t = shared(int_fast64_t)
aliasatomic_uint_fast64_t = shared(uint_fast64_t)
aliasatomic_intptr_t = shared(intptr_t)
aliasatomic_uintptr_t = shared(uintptr_t)
aliasatomic_size_t = shared(size_t)
aliasatomic_ptrdiff_t = shared(ptrdiff_t)
aliasatomic_intmax_t = shared(intmax_t)
aliasatomic_uintmax_t = shared(uintmax_t)
Functions 30
fn
bool atomic_is_lock_free(A)(const shared(A) * obj)fn
void atomic_flag_clear_impl()(atomic_flag * obj)fn
void atomic_flag_clear_explicit_impl()(atomic_flag * obj, memory_order order)fn
bool atomic_flag_test_and_set_impl()(atomic_flag * obj)fn
bool atomic_flag_test_and_set_explicit_impl()(atomic_flag * obj, memory_order order)fn
void atomic_init(A, C)(out shared(A) obj, C desired) @trustedInitializes an atomic variable, the destination should not have any expression associated with it prior to this call.fn
void atomic_signal_fence_impl()(memory_order order)Don't allow reordering, does not emit any instructions.fn
void atomic_thread_fence_impl()(memory_order order)Don't allow reordering, and emit a fence instruction.fn
bool atomic_compare_exchange_strong_impl(A, B, C)(shared(A) * obj, B * expected, C desired) @trustedfn
bool atomic_compare_exchange_weak_impl(A, B, C)(shared(A) * obj, B * expected, C desired) @trustedfn
bool atomic_compare_exchange_strong_explicit_impl(A, B, C)(shared(A) * obj, B * expected, C desired, memory_order succ, memory_order fail) @trustedfn
bool atomic_compare_exchange_weak_explicit_impl(A, B, C)(shared(A) * obj, B * expected, C desired, memory_order succ, memory_order fail) @trustedVariables 1
enumvar
ATOMIC_FLAG_INIT = atomic_flag.init