Line data Source code
1 0 : /*
2 : * Copyright (c) 1997-2015, Wind River Systems, Inc.
3 : *
4 : * SPDX-License-Identifier: Apache-2.0
5 : */
6 :
7 : #ifndef ZEPHYR_INCLUDE_SYS_ATOMIC_C_H_
8 : #define ZEPHYR_INCLUDE_SYS_ATOMIC_C_H_
9 :
10 : /* Included from <atomic.h> */
11 :
12 : #ifdef __cplusplus
13 : extern "C" {
14 : #endif
15 :
16 : /* Simple and correct (but very slow) implementation of atomic
17 : * primitives that require nothing more than kernel interrupt locking.
18 : */
19 :
20 0 : __syscall bool atomic_cas(atomic_t *target, atomic_val_t old_value,
21 : atomic_val_t new_value);
22 :
23 0 : __syscall bool atomic_ptr_cas(atomic_ptr_t *target, atomic_ptr_val_t old_value,
24 : atomic_ptr_val_t new_value);
25 :
26 0 : __syscall atomic_val_t atomic_add(atomic_t *target, atomic_val_t value);
27 :
28 0 : __syscall atomic_val_t atomic_sub(atomic_t *target, atomic_val_t value);
29 :
30 0 : static inline atomic_val_t atomic_inc(atomic_t *target)
31 : {
32 : return atomic_add(target, 1);
33 :
34 : }
35 :
36 0 : static inline atomic_val_t atomic_dec(atomic_t *target)
37 : {
38 : return atomic_sub(target, 1);
39 :
40 : }
41 :
42 0 : atomic_val_t atomic_get(const atomic_t *target);
43 :
44 0 : atomic_ptr_val_t atomic_ptr_get(const atomic_ptr_t *target);
45 :
46 0 : __syscall atomic_val_t atomic_set(atomic_t *target, atomic_val_t value);
47 :
48 0 : __syscall atomic_ptr_val_t atomic_ptr_set(atomic_ptr_t *target, atomic_ptr_val_t value);
49 :
50 0 : static inline atomic_val_t atomic_clear(atomic_t *target)
51 : {
52 : return atomic_set(target, 0);
53 :
54 : }
55 :
56 0 : static inline atomic_ptr_val_t atomic_ptr_clear(atomic_ptr_t *target)
57 : {
58 : return atomic_ptr_set(target, NULL);
59 :
60 : }
61 :
62 0 : __syscall atomic_val_t atomic_or(atomic_t *target, atomic_val_t value);
63 :
64 0 : __syscall atomic_val_t atomic_xor(atomic_t *target, atomic_val_t value);
65 :
66 0 : __syscall atomic_val_t atomic_and(atomic_t *target, atomic_val_t value);
67 :
68 0 : __syscall atomic_val_t atomic_nand(atomic_t *target, atomic_val_t value);
69 :
70 : #ifdef __cplusplus
71 : }
72 : #endif
73 :
74 : #ifdef CONFIG_ATOMIC_OPERATIONS_C
75 :
76 : #ifndef DISABLE_SYSCALL_TRACING
77 : /* Skip defining macros of atomic_*() for syscall tracing.
78 : * Compiler does not like "({ ... tracing code ... })" and complains
79 : *
80 : * error: expected identifier or '(' before '{' token
81 : *
82 : * ... even though there is a '(' before '{'.
83 : */
84 : #define DISABLE_SYSCALL_TRACING
85 : #define _REMOVE_DISABLE_SYSCALL_TRACING
86 : #endif
87 :
88 : #include <zephyr/syscalls/atomic_c.h>
89 :
90 : #ifdef _REMOVE_DISABLE_SYSCALL_TRACING
91 : #undef DISABLE_SYSCALL_TRACING
92 : #undef _REMOVE_DISABLE_SYSCALL_TRACING
93 : #endif
94 :
95 : #endif
96 :
97 : #endif /* ZEPHYR_INCLUDE_SYS_ATOMIC_C_H_ */
|