libmetal
Loading...
Searching...
No Matches
atomic.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2015, Xilinx Inc. and Contributors. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7/*
8 * @file atomic.h
9 * @brief Atomic primitives for libmetal.
10 */
11
12#ifndef __METAL_ATOMIC__H__
13#define __METAL_ATOMIC__H__
14
15#include <metal/config.h>
16
17#if defined(__cplusplus)
18# include <cstdint>
19
20/*
21 * <atomic> has the same functionality as <stdatomic.h> but all members are only
22 * accessible in the std namespace. As the rest of libmetal is pure C, it does
23 * not know about namespaces, even when compiled as part of a C++ file. So we
24 * just export the members of <atomic> into the global namespace.
25 */
26# include <atomic>
27using std::atomic_flag;
28using std::memory_order;
29using std::memory_order_relaxed;
30using std::memory_order_consume;
31using std::memory_order_acquire;
32using std::memory_order_release;
33using std::memory_order_acq_rel;
34using std::memory_order_seq_cst;
35
36using std::atomic_bool;
37using std::atomic_char;
38using std::atomic_schar;
39using std::atomic_uchar;
40using std::atomic_short;
41using std::atomic_ushort;
42using std::atomic_int;
43using std::atomic_uint;
44using std::atomic_long;
45using std::atomic_ulong;
46using std::atomic_llong;
47using std::atomic_ullong;
48using std::atomic_char16_t;
49using std::atomic_char32_t;
50using std::atomic_wchar_t;
51using std::atomic_int_least8_t;
52using std::atomic_uint_least8_t;
53using std::atomic_int_least16_t;
54using std::atomic_uint_least16_t;
55using std::atomic_int_least32_t;
56using std::atomic_uint_least32_t;
57using std::atomic_int_least64_t;
58using std::atomic_uint_least64_t;
59using std::atomic_int_fast8_t;
60using std::atomic_uint_fast8_t;
61using std::atomic_int_fast16_t;
62using std::atomic_uint_fast16_t;
63using std::atomic_int_fast32_t;
64using std::atomic_uint_fast32_t;
65using std::atomic_int_fast64_t;
66using std::atomic_uint_fast64_t;
67using std::atomic_intptr_t;
68using std::atomic_uintptr_t;
69using std::atomic_size_t;
70using std::atomic_ptrdiff_t;
71using std::atomic_intmax_t;
72using std::atomic_uintmax_t;
73
74using std::atomic_flag_test_and_set;
75using std::atomic_flag_test_and_set_explicit;
76using std::atomic_flag_clear;
77using std::atomic_flag_clear_explicit;
78using std::atomic_init;
79using std::atomic_is_lock_free;
80using std::atomic_store;
81using std::atomic_store_explicit;
82using std::atomic_load;
83using std::atomic_load_explicit;
84using std::atomic_exchange;
85using std::atomic_exchange_explicit;
86using std::atomic_compare_exchange_strong;
87using std::atomic_compare_exchange_strong_explicit;
88using std::atomic_compare_exchange_weak;
89using std::atomic_compare_exchange_weak_explicit;
90using std::atomic_fetch_add;
91using std::atomic_fetch_add_explicit;
92using std::atomic_fetch_sub;
93using std::atomic_fetch_sub_explicit;
94using std::atomic_fetch_or;
95using std::atomic_fetch_or_explicit;
96using std::atomic_fetch_xor;
97using std::atomic_fetch_xor_explicit;
98using std::atomic_fetch_and;
99using std::atomic_fetch_and_explicit;
100using std::atomic_thread_fence;
101using std::atomic_signal_fence;
102
103#elif defined(HAVE_STDATOMIC_H) && !defined(__CC_ARM) && \
104 !defined(__STDC_NO_ATOMICS__)
105# include <stdint.h>
106# include <stdatomic.h>
107#elif defined(__GNUC__)
108# include <metal/compiler/gcc/atomic.h>
109#else
110# include <metal/processor/@PROJECT_PROCESSOR@/atomic.h>
111#endif
112
113#endif /* __METAL_ATOMIC__H__ */