Zephyr API Documentation 4.5.0-rc1
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
atomic_builtin.h
Go to the documentation of this file.
1/* atomic operations */
2
3/*
4 * Copyright (c) 1997-2015, Wind River Systems, Inc.
5 * Copyright (c) 2023 Nordic Semiconductor ASA
6 *
7 * SPDX-License-Identifier: Apache-2.0
8 */
9
16
17/* IWYU pragma: private, include "zephyr/sys/atomic.h" */
18
19#ifndef ZEPHYR_INCLUDE_SYS_ATOMIC_BUILTIN_H_
20#define ZEPHYR_INCLUDE_SYS_ATOMIC_BUILTIN_H_
21
22#include <stdbool.h>
23#include <stddef.h>
25
26#ifdef __cplusplus
27extern "C" {
28#endif
29
30/* Included from <atomic.h> */
31
33
34static inline bool atomic_cas(atomic_t *target, atomic_val_t old_value,
35 atomic_val_t new_value)
36{
37 return __atomic_compare_exchange_n(target, &old_value, new_value,
38 0, __ATOMIC_SEQ_CST,
39 __ATOMIC_SEQ_CST);
40}
41
42static inline bool atomic_ptr_cas(atomic_ptr_t *target, atomic_ptr_val_t old_value,
43 atomic_ptr_val_t new_value)
44{
45 return __atomic_compare_exchange_n(target, &old_value, new_value,
46 0, __ATOMIC_SEQ_CST,
47 __ATOMIC_SEQ_CST);
48}
49
50static inline atomic_val_t atomic_add(atomic_t *target, atomic_val_t value)
51{
52 return __atomic_fetch_add(target, value, __ATOMIC_SEQ_CST);
53}
54
55static inline atomic_val_t atomic_sub(atomic_t *target, atomic_val_t value)
56{
57 return __atomic_fetch_sub(target, value, __ATOMIC_SEQ_CST);
58}
59
60static inline atomic_val_t atomic_inc(atomic_t *target)
61{
62 return atomic_add(target, 1);
63}
64
65static inline atomic_val_t atomic_dec(atomic_t *target)
66{
67 return atomic_sub(target, 1);
68}
69
70static inline atomic_val_t atomic_get(const atomic_t *target)
71{
72 return __atomic_load_n(target, __ATOMIC_SEQ_CST);
73}
74
75static inline atomic_ptr_val_t atomic_ptr_get(const atomic_ptr_t *target)
76{
77 return __atomic_load_n(target, __ATOMIC_SEQ_CST);
78}
79
80static inline atomic_val_t atomic_set(atomic_t *target, atomic_val_t value)
81{
82 /* This builtin, as described by Intel, is not a traditional
83 * test-and-set operation, but rather an atomic exchange operation. It
84 * writes value into *ptr, and returns the previous contents of *ptr.
85 */
86 return __atomic_exchange_n(target, value, __ATOMIC_SEQ_CST);
87}
88
90{
91 return __atomic_exchange_n(target, value, __ATOMIC_SEQ_CST);
92}
93
94static inline atomic_val_t atomic_clear(atomic_t *target)
95{
96 return atomic_set(target, 0);
97}
98
100{
101 return atomic_ptr_set(target, NULL);
102}
103
104static inline atomic_val_t atomic_or(atomic_t *target, atomic_val_t value)
105{
106 return __atomic_fetch_or(target, value, __ATOMIC_SEQ_CST);
107}
108
109static inline atomic_val_t atomic_xor(atomic_t *target, atomic_val_t value)
110{
111 return __atomic_fetch_xor(target, value, __ATOMIC_SEQ_CST);
112}
113
114static inline atomic_val_t atomic_and(atomic_t *target, atomic_val_t value)
115{
116 return __atomic_fetch_and(target, value, __ATOMIC_SEQ_CST);
117}
118
119static inline atomic_val_t atomic_nand(atomic_t *target, atomic_val_t value)
120{
121 return __atomic_fetch_nand(target, value, __ATOMIC_SEQ_CST);
122}
123
125
126#ifdef __cplusplus
127}
128#endif
129
130#endif /* ZEPHYR_INCLUDE_SYS_ATOMIC_BUILTIN_H_ */
Atomic type definitions for the atomic operations API.
long atomic_t
Atomic integer variable.
Definition atomic_types.h:34
atomic_val_t atomic_or(atomic_t *target, atomic_val_t value)
Atomic bitwise inclusive OR.
atomic_val_t atomic_xor(atomic_t *target, atomic_val_t value)
Atomic bitwise exclusive OR (XOR).
atomic_ptr_val_t atomic_ptr_get(const atomic_ptr_t *target)
Atomic get a pointer value.
atomic_t atomic_val_t
Value type for atomic integer variables.
Definition atomic_types.h:41
atomic_val_t atomic_get(const atomic_t *target)
Atomic get.
atomic_ptr_t atomic_ptr_val_t
Value type for atomic pointer variables.
Definition atomic_types.h:56
atomic_ptr_val_t atomic_ptr_set(atomic_ptr_t *target, atomic_ptr_val_t value)
Atomic get-and-set for pointer values.
atomic_val_t atomic_nand(atomic_t *target, atomic_val_t value)
Atomic bitwise NAND.
atomic_val_t atomic_and(atomic_t *target, atomic_val_t value)
Atomic bitwise AND.
atomic_val_t atomic_add(atomic_t *target, atomic_val_t value)
Atomic addition.
atomic_ptr_val_t atomic_ptr_clear(atomic_ptr_t *target)
Atomic clear of a pointer value.
atomic_val_t atomic_set(atomic_t *target, atomic_val_t value)
Atomic get-and-set.
atomic_val_t atomic_sub(atomic_t *target, atomic_val_t value)
Atomic subtraction.
atomic_val_t atomic_clear(atomic_t *target)
Atomic clear.
bool atomic_ptr_cas(atomic_ptr_t *target, atomic_ptr_val_t old_value, atomic_ptr_val_t new_value)
Atomic compare-and-set with pointer values.
atomic_val_t atomic_inc(atomic_t *target)
Atomic increment.
bool atomic_cas(atomic_t *target, atomic_val_t old_value, atomic_val_t new_value)
Atomic compare-and-set.
atomic_val_t atomic_dec(atomic_t *target)
Atomic decrement.
void * atomic_ptr_t
Atomic pointer variable.
Definition atomic_types.h:49