Go to the documentation of this file.
   36 #if __has_extension(c_atomic) || __has_extension(cxx_atomic) 
   37 #define __CLANG_ATOMICS 
   38 #elif __GNUC_PREREQ__(4, 7) 
   39 #define __GNUC_ATOMICS 
   40 #elif defined(__GNUC__) 
   41 #define __SYNC_ATOMICS 
   43 #error "stdatomic.h does not support your compiler" 
   50 #ifdef __GCC_ATOMIC_BOOL_LOCK_FREE 
   51 #define ATOMIC_BOOL_LOCK_FREE           __GCC_ATOMIC_BOOL_LOCK_FREE 
   53 #ifdef __GCC_ATOMIC_CHAR_LOCK_FREE 
   54 #define ATOMIC_CHAR_LOCK_FREE           __GCC_ATOMIC_CHAR_LOCK_FREE 
   56 #ifdef __GCC_ATOMIC_CHAR16_T_LOCK_FREE 
   57 #define ATOMIC_CHAR16_T_LOCK_FREE       __GCC_ATOMIC_CHAR16_T_LOCK_FREE 
   59 #ifdef __GCC_ATOMIC_CHAR32_T_LOCK_FREE 
   60 #define ATOMIC_CHAR32_T_LOCK_FREE       __GCC_ATOMIC_CHAR32_T_LOCK_FREE 
   62 #ifdef __GCC_ATOMIC_WCHAR_T_LOCK_FREE 
   63 #define ATOMIC_WCHAR_T_LOCK_FREE        __GCC_ATOMIC_WCHAR_T_LOCK_FREE 
   65 #ifdef __GCC_ATOMIC_SHORT_LOCK_FREE 
   66 #define ATOMIC_SHORT_LOCK_FREE          __GCC_ATOMIC_SHORT_LOCK_FREE 
   68 #ifdef __GCC_ATOMIC_INT_LOCK_FREE 
   69 #define ATOMIC_INT_LOCK_FREE            __GCC_ATOMIC_INT_LOCK_FREE 
   71 #ifdef __GCC_ATOMIC_LONG_LOCK_FREE 
   72 #define ATOMIC_LONG_LOCK_FREE           __GCC_ATOMIC_LONG_LOCK_FREE 
   74 #ifdef __GCC_ATOMIC_LLONG_LOCK_FREE 
   75 #define ATOMIC_LLONG_LOCK_FREE          __GCC_ATOMIC_LLONG_LOCK_FREE 
   77 #ifdef __GCC_ATOMIC_POINTER_LOCK_FREE 
   78 #define ATOMIC_POINTER_LOCK_FREE        __GCC_ATOMIC_POINTER_LOCK_FREE 
   85 #if defined(__CLANG_ATOMICS) 
   86 #define ATOMIC_VAR_INIT(value)          (value) 
   87 #define atomic_init(obj, value)         __c11_atomic_init(obj, value) 
   89 #define ATOMIC_VAR_INIT(value)          { .__val = (value) } 
   90 #define atomic_init(obj, value)         ((void)((obj)->__val = (value))) 
   99 #ifndef __ATOMIC_RELAXED 
  100 #define __ATOMIC_RELAXED                0 
  102 #ifndef __ATOMIC_CONSUME 
  103 #define __ATOMIC_CONSUME                1 
  105 #ifndef __ATOMIC_ACQUIRE 
  106 #define __ATOMIC_ACQUIRE                2 
  108 #ifndef __ATOMIC_RELEASE 
  109 #define __ATOMIC_RELEASE                3 
  111 #ifndef __ATOMIC_ACQ_REL 
  112 #define __ATOMIC_ACQ_REL                4 
  114 #ifndef __ATOMIC_SEQ_CST 
  115 #define __ATOMIC_SEQ_CST                5 
  142 #ifdef __CLANG_ATOMICS 
  143         __c11_atomic_thread_fence(__order);
 
  144 #elif defined(__GNUC_ATOMICS) 
  145         __atomic_thread_fence(__order);
 
  147         __sync_synchronize();
 
  155 #ifdef __CLANG_ATOMICS 
  156         __c11_atomic_signal_fence(__order);
 
  157 #elif defined(__GNUC_ATOMICS) 
  158         __atomic_signal_fence(__order);
 
  160         __asm volatile (
"" ::: 
"memory");
 
  170 #define atomic_is_lock_free(obj) \ 
  171         ((void)(obj), (_Bool)1) 
  172 #elif defined(__CLANG_ATOMICS) 
  173 #define atomic_is_lock_free(obj) \ 
  174         __atomic_is_lock_free(sizeof(*(obj)), obj) 
  175 #elif defined(__GNUC_ATOMICS) 
  176 #define atomic_is_lock_free(obj) \ 
  177         __atomic_is_lock_free(sizeof((obj)->__val), &(obj)->__val) 
  179 #define atomic_is_lock_free(obj) \ 
  180         ((void)(obj), sizeof((obj)->__val) <= sizeof(void *)) 
  187 typedef _Atomic(_Bool)                  atomic_bool;
 
  188 typedef _Atomic(
char)                   atomic_char;
 
  189 typedef _Atomic(
signed char)            atomic_schar;
 
  190 typedef _Atomic(
unsigned char)          atomic_uchar;
 
  191 typedef _Atomic(
short)                  atomic_short;
 
  192 typedef _Atomic(
unsigned short)         atomic_ushort;
 
  193 typedef _Atomic(
int)                    atomic_int;
 
  194 typedef _Atomic(
unsigned int)           atomic_uint;
 
  195 typedef _Atomic(
long)                   atomic_long;
 
  196 typedef _Atomic(
unsigned long)          atomic_ulong;
 
  197 typedef _Atomic(
long long)              atomic_llong;
 
  198 typedef _Atomic(
unsigned long long)     atomic_ullong;
 
  233 #if defined(__CLANG_ATOMICS) 
  234 #define atomic_compare_exchange_strong_explicit(object, expected,       \ 
  235     desired, success, failure)                                          \ 
  236         __c11_atomic_compare_exchange_strong(object, expected, desired, \ 
  238 #define atomic_compare_exchange_weak_explicit(object, expected,         \ 
  239     desired, success, failure)                                          \ 
  240         __c11_atomic_compare_exchange_weak(object, expected, desired,   \ 
  242 #define atomic_exchange_explicit(object, desired, order)                \ 
  243         __c11_atomic_exchange(object, desired, order) 
  244 #define atomic_fetch_add_explicit(object, operand, order)               \ 
  245         __c11_atomic_fetch_add(object, operand, order) 
  246 #define atomic_fetch_and_explicit(object, operand, order)               \ 
  247         __c11_atomic_fetch_and(object, operand, order) 
  248 #define atomic_fetch_or_explicit(object, operand, order)                \ 
  249         __c11_atomic_fetch_or(object, operand, order) 
  250 #define atomic_fetch_sub_explicit(object, operand, order)               \ 
  251         __c11_atomic_fetch_sub(object, operand, order) 
  252 #define atomic_fetch_xor_explicit(object, operand, order)               \ 
  253         __c11_atomic_fetch_xor(object, operand, order) 
  254 #define atomic_load_explicit(object, order)                             \ 
  255         __c11_atomic_load(object, order) 
  256 #define atomic_store_explicit(object, desired, order)                   \ 
  257         __c11_atomic_store(object, desired, order) 
  258 #elif defined(__GNUC_ATOMICS) 
  259 #define atomic_compare_exchange_strong_explicit(object, expected,       \ 
  260     desired, success, failure)                                          \ 
  261         __atomic_compare_exchange_n(&(object)->__val, expected,         \ 
  262             desired, 0, success, failure) 
  263 #define atomic_compare_exchange_weak_explicit(object, expected,         \ 
  264     desired, success, failure)                                          \ 
  265         __atomic_compare_exchange_n(&(object)->__val, expected,         \ 
  266             desired, 1, success, failure) 
  267 #define atomic_exchange_explicit(object, desired, order)                \ 
  268         __atomic_exchange_n(&(object)->__val, desired, order) 
  269 #define atomic_fetch_add_explicit(object, operand, order)               \ 
  270         __atomic_fetch_add(&(object)->__val, operand, order) 
  271 #define atomic_fetch_and_explicit(object, operand, order)               \ 
  272         __atomic_fetch_and(&(object)->__val, operand, order) 
  273 #define atomic_fetch_or_explicit(object, operand, order)                \ 
  274         __atomic_fetch_or(&(object)->__val, operand, order) 
  275 #define atomic_fetch_sub_explicit(object, operand, order)               \ 
  276         __atomic_fetch_sub(&(object)->__val, operand, order) 
  277 #define atomic_fetch_xor_explicit(object, operand, order)               \ 
  278         __atomic_fetch_xor(&(object)->__val, operand, order) 
  279 #define atomic_load_explicit(object, order)                             \ 
  280         __atomic_load_n(&(object)->__val, order) 
  281 #define atomic_store_explicit(object, desired, order)                   \ 
  282         __atomic_store_n(&(object)->__val, desired, order) 
  284 #define __atomic_apply_stride(object, operand) \ 
  285         (((__typeof__((object)->__val))0) + (operand)) 
  286 #define atomic_compare_exchange_strong_explicit(object, expected,       \ 
  287     desired, success, failure)  __extension__ ({                        \ 
  288         __typeof__(expected) __ep = (expected);                         \ 
  289         __typeof__(*__ep) __e = *__ep;                                  \ 
  290         (void)(success); (void)(failure);                               \ 
  291         (_Bool)((*__ep = __sync_val_compare_and_swap(&(object)->__val,  \ 
  292             __e, desired)) == __e);                                     \ 
  294 #define atomic_compare_exchange_weak_explicit(object, expected,         \ 
  295     desired, success, failure)                                          \ 
  296         atomic_compare_exchange_strong_explicit(object, expected,       \ 
  297                 desired, success, failure) 
  298 #if __has_builtin(__sync_swap) 
  300 #define atomic_exchange_explicit(object, desired, order)                \ 
  301         ((void)(order), __sync_swap(&(object)->__val, desired)) 
  308 #define atomic_exchange_explicit(object, desired, order)                \ 
  310         __typeof__(object) __o = (object);                              \ 
  311         __typeof__(desired) __d = (desired);                            \ 
  313         __sync_synchronize();                                           \ 
  314         __sync_lock_test_and_set(&(__o)->__val, __d);                   \ 
  317 #define atomic_fetch_add_explicit(object, operand, order)               \ 
  318         ((void)(order), __sync_fetch_and_add(&(object)->__val,          \ 
  319             __atomic_apply_stride(object, operand))) 
  320 #define atomic_fetch_and_explicit(object, operand, order)               \ 
  321         ((void)(order), __sync_fetch_and_and(&(object)->__val, operand)) 
  322 #define atomic_fetch_or_explicit(object, operand, order)                \ 
  323         ((void)(order), __sync_fetch_and_or(&(object)->__val, operand)) 
  324 #define atomic_fetch_sub_explicit(object, operand, order)               \ 
  325         ((void)(order), __sync_fetch_and_sub(&(object)->__val,          \ 
  326             __atomic_apply_stride(object, operand))) 
  327 #define atomic_fetch_xor_explicit(object, operand, order)               \ 
  328         ((void)(order), __sync_fetch_and_xor(&(object)->__val, operand)) 
  329 #define atomic_load_explicit(object, order)                             \ 
  330         ((void)(order), __sync_fetch_and_add(&(object)->__val, 0)) 
  331 #define atomic_store_explicit(object, desired, order)                   \ 
  332         ((void)atomic_exchange_explicit(object, desired, order)) 
  343 #define atomic_compare_exchange_strong(object, expected, desired)       \ 
  344         atomic_compare_exchange_strong_explicit(object, expected,       \ 
  345             desired, memory_order_seq_cst, memory_order_seq_cst) 
  346 #define atomic_compare_exchange_weak(object, expected, desired)         \ 
  347         atomic_compare_exchange_weak_explicit(object, expected,         \ 
  348             desired, memory_order_seq_cst, memory_order_seq_cst) 
  349 #define atomic_exchange(object, desired)                                \ 
  350         atomic_exchange_explicit(object, desired, memory_order_seq_cst) 
  351 #define atomic_fetch_add(object, operand)                               \ 
  352         atomic_fetch_add_explicit(object, operand, memory_order_seq_cst) 
  353 #define atomic_fetch_and(object, operand)                               \ 
  354         atomic_fetch_and_explicit(object, operand, memory_order_seq_cst) 
  355 #define atomic_fetch_or(object, operand)                                \ 
  356         atomic_fetch_or_explicit(object, operand, memory_order_seq_cst) 
  357 #define atomic_fetch_sub(object, operand)                               \ 
  358         atomic_fetch_sub_explicit(object, operand, memory_order_seq_cst) 
  359 #define atomic_fetch_xor(object, operand)                               \ 
  360         atomic_fetch_xor_explicit(object, operand, memory_order_seq_cst) 
  361 #define atomic_load(object)                                             \ 
  362         atomic_load_explicit(object, memory_order_seq_cst) 
  363 #define atomic_store(object, desired)                                   \ 
  364         atomic_store_explicit(object, desired, memory_order_seq_cst) 
  378 #define ATOMIC_FLAG_INIT                { ATOMIC_VAR_INIT(0) } 
  381 atomic_flag_test_and_set_explicit(
volatile atomic_flag *__object,
 
  396 atomic_flag_test_and_set(
volatile atomic_flag *__object)
 
  399         return (atomic_flag_test_and_set_explicit(__object,
 
  
 
typedef _Atomic(_Bool) atomic_bool
__uint_least16_t __char16_t
#define atomic_store_explicit(object, desired, order)
__uint64_t __uint_least64_t
__uint8_t __uint_least8_t
__uint_least32_t __char32_t
__int64_t __int_least64_t
#define atomic_exchange_explicit(object, desired, order)
__uint32_t __uint_least32_t
__uint16_t __uint_least16_t
__int16_t __int_least16_t
__asm(".globl sysFork_old       \n" "sysFork_old:                 \n" "  xor   %eax,%eax        \n" "  call  schedNewTask     \n" "  testl %eax,%eax        \n" "  je fork_ret            \n" "  pushl %esi             \n" "  pushl %edi             \n" "  pushl %ebp             \n" "  pushl %eax             \n" "  call  fork_copyProcess \n" "  movl  %eax,(%ebx)      \n" "  addl  $16,%esp         \n" "fork_ret:                \n" "  ret                    \n")
__uint64_t __uint_fast64_t
__uint16_t __uint_fast16_t
__uint32_t __uint_fast32_t
__int32_t __int_least32_t