VSF Documented
stdatomic.h
Go to the documentation of this file.
1#ifndef __SIMPLE_LIBC_STDATOMIC_H__
2#define __SIMPLE_LIBC_STDATOMIC_H__
3
5
6#if VSF_LINUX_CFG_RELATIVE_PATH == ENABLED
7# include "../sys/types.h"
8#else
9# include <sys/types.h>
10#endif
11
12// for protect
13#include "hal/arch/vsf_arch.h"
14
15#ifdef __cplusplus
16extern "C" {
17#endif
18
19typedef bool atomic_bool;
20typedef char atomic_char;
21typedef signed char atomic_schar;
22typedef unsigned char atomic_uchar;
23typedef short atomic_short;
24typedef unsigned short atomic_ushort;
25typedef int atomic_int;
26typedef unsigned int atomic_uint;
27typedef long atomic_long;
28typedef unsigned long atomic_ulong;
29typedef long long atomic_llong;
30typedef unsigned long long atomic_ullong;
33typedef wchar_t atomic_wchar_t;
52typedef size_t atomic_size_t;
56
64};
65
66#define ATOMIC_VAR_INIT(__VALUE) (__VALUE)
67
68#define atomic_init(object, value) \
69 atomic_store_explicit(object, value, memory_order_relaxed)
70
71#define atomic_store_explicit(object, desired, order) \
72 ({ \
73 vsf_protect_t VSF_MACRO_SAFE_NAME(protect) = vsf_protect_int(); \
74 *(object) = desired; \
75 vsf_unprotect_int(VSF_MACRO_SAFE_NAME(protect)); \
76 })
77#define atomic_store(object, desired) \
78 atomic_store_explicit(object, desired, memory_order_seq_cst)
79
80#define atomic_load_explicit(object, order) \
81 ({ \
82 typeof(*object) VSF_MACRO_SAFE_NAME(tmp); \
83 vsf_protect_t VSF_MACRO_SAFE_NAME(protect) = vsf_protect_int(); \
84 VSF_MACRO_SAFE_NAME(tmp) = *(object); \
85 vsf_unprotect_int(VSF_MACRO_SAFE_NAME(protect)); \
86 VSF_MACRO_SAFE_NAME(tmp); \
87 })
88#define atomic_load(object) \
89 atomic_load_explicit(object, memory_order_seq_cst)
90
91#define atomic_exchange_explicit(object, desired, order) \
92 ({ \
93 typeof(*object) VSF_MACRO_SAFE_NAME(tmp); \
94 vsf_protect_t VSF_MACRO_SAFE_NAME(protect) = vsf_protect_int(); \
95 VSF_MACRO_SAFE_NAME(tmp) = *(object); \
96 *(object) = desired; \
97 vsf_unprotect_int(VSF_MACRO_SAFE_NAME(protect)); \
98 VSF_MACRO_SAFE_NAME(tmp); \
99 })
100#define atomic_exchange(object, desired) \
101 atomic_exchange_explicit(object, desired, memory_order_seq_cst)
102
103#define atomic_compare_exchange_strong_explicit(object, expected, desired, order_success, order_fail)\
104 ({ \
105 vsf_protect_t VSF_MACRO_SAFE_NAME(protect) = vsf_protect_int(); \
106 if (*(object) == *(expected)) { \
107 *(object) = desired; \
108 } else { \
109 *(expected) = *(object); \
110 } \
111 vsf_unprotect_int(VSF_MACRO_SAFE_NAME(protect)); \
112 })
113#define atomic_compare_exchange_strong(object, expected, desired) \
114 atomic_compare_exchange_strong_explicit(object, expected, desired, memory_order_seq_cst, memory_order_seq_cst)
115
116#define atomic_compare_exchange_weak_explicit(object, expected, desired, order_success, order_fail)\
117 ({ \
118 vsf_protect_t VSF_MACRO_SAFE_NAME(protect) = vsf_protect_int(); \
119 if (*(object) == *(expected)) { \
120 *(object) = desired; \
121 } else { \
122 *(expected) = *(object); \
123 } \
124 vsf_unprotect_int(VSF_MACRO_SAFE_NAME(protect)); \
125 })
126#define atomic_compare_exchange_weak(object, expected, desired) \
127 atomic_compare_exchange_weak_explicit(object, expected, desired, memory_order_seq_cst, memory_order_seq_cst)
128
129#define atomic_fetch_add_explicit(object, operand, order) \
130 ({ \
131 typeof(*object) VSF_MACRO_SAFE_NAME(__tmp); \
132 vsf_protect_t VSF_MACRO_SAFE_NAME(protect) = vsf_protect_int(); \
133 VSF_MACRO_SAFE_NAME(__tmp) = *(object); \
134 *(object) += operand; \
135 vsf_unprotect_int(VSF_MACRO_SAFE_NAME(protect)); \
136 VSF_MACRO_SAFE_NAME(__tmp); \
137 })
138#define atomic_fetch_add(object, operand) \
139 atomic_fetch_add_explicit(object, operand, memory_order_seq_cst)
140
141#define atomic_fetch_sub_explicit(object, operand, order) \
142 ({ \
143 typeof(*object) VSF_MACRO_SAFE_NAME(tmp); \
144 vsf_protect_t VSF_MACRO_SAFE_NAME(protect) = vsf_protect_int(); \
145 VSF_MACRO_SAFE_NAME(tmp) = *(object); \
146 *(object) -= operand; \
147 vsf_unprotect_int(VSF_MACRO_SAFE_NAME(protect)); \
148 VSF_MACRO_SAFE_NAME(tmp); \
149 })
150#define atomic_fetch_sub(object, operand) \
151 atomic_fetch_sub_explicit(object, operand, memory_order_seq_cst)
152
153#define atomic_fetch_or_explicit(object, operand, order) \
154 ({ \
155 typeof(*object) VSF_MACRO_SAFE_NAME(tmp); \
156 vsf_protect_t VSF_MACRO_SAFE_NAME(protect) = vsf_protect_int(); \
157 VSF_MACRO_SAFE_NAME(tmp) = *(object); \
158 *(object) |= operand; \
159 vsf_unprotect_int(VSF_MACRO_SAFE_NAME(protect)); \
160 VSF_MACRO_SAFE_NAME(tmp); \
161 })
162#define atomic_fetch_or(object, operand) \
163 atomic_fetch_or_explicit(object, operand, memory_order_seq_cst)
164
165#define atomic_fetch_xor_explicit(object, operand, order) \
166 ({ \
167 typeof(*object) VSF_MACRO_SAFE_NAME(tmp); \
168 vsf_protect_t VSF_MACRO_SAFE_NAME(protect) = vsf_protect_int(); \
169 VSF_MACRO_SAFE_NAME(tmp) = *(object); \
170 *(object) ^= operand; \
171 vsf_unprotect_int(VSF_MACRO_SAFE_NAME(protect)); \
172 VSF_MACRO_SAFE_NAME(tmp); \
173 })
174#define atomic_fetch_xor(object, operand) \
175 atomic_fetch_xor_explicit(object, operand, memory_order_seq_cst)
176
177#define atomic_fetch_and_explicit(object, operand, order) \
178 ({ \
179 typeof(*object) VSF_MACRO_SAFE_NAME(tmp); \
180 vsf_protect_t VSF_MACRO_SAFE_NAME(protect) = vsf_protect_int(); \
181 VSF_MACRO_SAFE_NAME(tmp) = *(object); \
182 *(object) &= operand; \
183 vsf_unprotect_int(VSF_MACRO_SAFE_NAME(protect)); \
184 VSF_MACRO_SAFE_NAME(tmp); \
185 })
186#define atomic_fetch_and(object, operand) \
187 atomic_fetch_and_explicit(object, operand, memory_order_seq_cst)
188
189#ifdef __cplusplus
190}
191#endif
192
193#endif
long int ptrdiff_t
Definition stddef.h:117
int_fast8_t atomic_int_fast8_t
Definition stdatomic.h:42
uint_fast64_t atomic_uint_fast64_t
Definition stdatomic.h:49
memory_order
Definition stdatomic.h:57
@ memory_order_consume
Definition stdatomic.h:59
@ memory_order_seq_cst
Definition stdatomic.h:63
@ memory_order_release
Definition stdatomic.h:61
@ memory_order_relaxed
Definition stdatomic.h:58
@ memory_order_acq_rel
Definition stdatomic.h:62
@ memory_order_acquire
Definition stdatomic.h:60
uint_least8_t atomic_uint_least8_t
Definition stdatomic.h:35
unsigned long long atomic_ullong
Definition stdatomic.h:30
unsigned char atomic_uchar
Definition stdatomic.h:22
uint_fast16_t atomic_uint_fast16_t
Definition stdatomic.h:45
uint_least16_t atomic_char16_t
Definition stdatomic.h:31
int atomic_int
Definition stdatomic.h:25
char atomic_char
Definition stdatomic.h:20
intptr_t atomic_intptr_t
Definition stdatomic.h:50
int_least64_t atomic_int_least64_t
Definition stdatomic.h:40
unsigned int atomic_uint
Definition stdatomic.h:26
uint_fast8_t atomic_uint_fast8_t
Definition stdatomic.h:43
bool atomic_bool
Definition stdatomic.h:19
uint_least32_t atomic_char32_t
Definition stdatomic.h:32
short atomic_short
Definition stdatomic.h:23
unsigned short atomic_ushort
Definition stdatomic.h:24
ptrdiff_t atomic_ptrdiff_t
Definition stdatomic.h:53
long atomic_long
Definition stdatomic.h:27
int_least32_t atomic_int_least32_t
Definition stdatomic.h:38
size_t atomic_size_t
Definition stdatomic.h:52
unsigned long atomic_ulong
Definition stdatomic.h:28
uintmax_t atomic_uintmax_t
Definition stdatomic.h:55
int_fast64_t atomic_int_fast64_t
Definition stdatomic.h:48
uintptr_t atomic_uintptr_t
Definition stdatomic.h:51
int_fast32_t atomic_int_fast32_t
Definition stdatomic.h:46
wchar_t atomic_wchar_t
Definition stdatomic.h:33
long long atomic_llong
Definition stdatomic.h:29
int_fast16_t atomic_int_fast16_t
Definition stdatomic.h:44
uint_fast32_t atomic_uint_fast32_t
Definition stdatomic.h:47
intmax_t atomic_intmax_t
Definition stdatomic.h:54
int_least16_t atomic_int_least16_t
Definition stdatomic.h:36
uint_least16_t atomic_uint_least16_t
Definition stdatomic.h:37
signed char atomic_schar
Definition stdatomic.h:21
uint_least64_t atomic_uint_least64_t
Definition stdatomic.h:41
int_least8_t atomic_int_least8_t
Definition stdatomic.h:34
uint_least32_t atomic_uint_least32_t
Definition stdatomic.h:39
uint32_t uintptr_t
Definition stdint.h:38
long long int_least64_t
Definition stdint.h:19
unsigned char uint_fast8_t
Definition stdint.h:23
int32_t intptr_t
Definition stdint.h:39
unsigned int uint_fast32_t
Definition stdint.h:27
int int_least32_t
Definition stdint.h:17
unsigned long long uintmax_t
Definition stdint.h:32
short int_least16_t
Definition stdint.h:15
long long int_fast64_t
Definition stdint.h:28
int int_fast32_t
Definition stdint.h:26
unsigned long long uint_least64_t
Definition stdint.h:20
unsigned uint_least32_t
Definition stdint.h:18
unsigned short uint_fast16_t
Definition stdint.h:25
unsigned char uint_least8_t
Definition stdint.h:14
unsigned long long uint_fast64_t
Definition stdint.h:29
long long intmax_t
Definition stdint.h:31
unsigned short uint_least16_t
Definition stdint.h:16
signed char int_least8_t
Definition stdint.h:13
char int_fast8_t
Definition stdint.h:22
short int_fast16_t
Definition stdint.h:24