1
2#ifndef __TOOLS_ASM_GENERIC_ATOMIC_H
3#define __TOOLS_ASM_GENERIC_ATOMIC_H
4
5#include <linux/compiler.h>
6#include <linux/types.h>
7
8
9
10
11
12
13
14
15#define ATOMIC_INIT(i) { (i) }
16
17
18
19
20
21
22
23static inline int atomic_read(const atomic_t *v)
24{
25 return READ_ONCE((v)->counter);
26}
27
28
29
30
31
32
33
34
35static inline void atomic_set(atomic_t *v, int i)
36{
37 v->counter = i;
38}
39
40
41
42
43
44
45
46static inline void atomic_inc(atomic_t *v)
47{
48 __sync_add_and_fetch(&v->counter, 1);
49}
50
51
52
53
54
55
56
57
58
59static inline int atomic_dec_and_test(atomic_t *v)
60{
61 return __sync_sub_and_fetch(&v->counter, 1) == 0;
62}
63
64#define cmpxchg(ptr, oldval, newval) \
65 __sync_val_compare_and_swap(ptr, oldval, newval)
66
67static inline int atomic_cmpxchg(atomic_t *v, int oldval, int newval)
68{
69 return cmpxchg(&(v)->counter, oldval, newval);
70}
71
72#endif
73