PipeWire  1.6.4
atomic.h
1 /* Atomic operations */
2 /* SPDX-FileCopyrightText: Copyright © 2023 Wim Taymans */
3 /* SPDX-License-Identifier: MIT */
4 
5 #ifndef SPA_ATOMIC_H
6 #define SPA_ATOMIC_H
7 
8 #ifdef __cplusplus
9 extern "C" {
10 #endif
11 
12 #define SPA_ATOMIC_CAS(v,ov,nv) \
13 ({ \
14  __typeof__(v) __ov = (ov); \
15  __atomic_compare_exchange_n(&(v), &__ov, (nv), \
16  0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); \
17 })
18 
19 #define SPA_ATOMIC_DEC(s) __atomic_sub_fetch(&(s), 1, __ATOMIC_SEQ_CST)
20 #define SPA_ATOMIC_INC(s) __atomic_add_fetch(&(s), 1, __ATOMIC_SEQ_CST)
21 #define SPA_ATOMIC_LOAD(s) __atomic_load_n(&(s), __ATOMIC_SEQ_CST)
22 #define SPA_LOAD_ONCE(s) __atomic_load_n((s), __ATOMIC_RELAXED)
23 #define SPA_STORE_ONCE(s) __atomic_store_n((s), __ATOMIC_RELAXED)
24 #define SPA_ATOMIC_STORE(s,v) __atomic_store_n(&(s), (v), __ATOMIC_SEQ_CST)
25 #define SPA_ATOMIC_XCHG(s,v) __atomic_exchange_n(&(s), (v), __ATOMIC_SEQ_CST)
26 
27 #define SPA_SEQ_WRITE(s) SPA_ATOMIC_INC(s)
28 #define SPA_SEQ_WRITE_SUCCESS(s1,s2) ((s1) + 1 == (s2) && ((s2) & 1) == 0)
29 
30 #define SPA_SEQ_READ(s) SPA_ATOMIC_LOAD(s)
31 #define SPA_SEQ_READ_SUCCESS(s1,s2) ((s1) == (s2) && ((s2) & 1) == 0)
32 
33 #ifdef __cplusplus
34 } /* extern "C" */
35 #endif
36 
37 #endif /* SPA_ATOMIC_H */