This source file includes following definitions.
- atomic_read
- atomic_set
- atomic_inc
- atomic_dec_and_test
- atomic_cmpxchg
1
2 #ifndef _TOOLS_LINUX_ASM_X86_ATOMIC_H
3 #define _TOOLS_LINUX_ASM_X86_ATOMIC_H
4
5 #include <linux/compiler.h>
6 #include <linux/types.h>
7 #include "rmwcc.h"
8
9 #define LOCK_PREFIX "\n\tlock; "
10
11 #include <asm/cmpxchg.h>
12
13
14
15
16
17
18 #define ATOMIC_INIT(i) { (i) }
19
20
21
22
23
24
25
26 static inline int atomic_read(const atomic_t *v)
27 {
28 return READ_ONCE((v)->counter);
29 }
30
31
32
33
34
35
36
37
38 static inline void atomic_set(atomic_t *v, int i)
39 {
40 v->counter = i;
41 }
42
43
44
45
46
47
48
49 static inline void atomic_inc(atomic_t *v)
50 {
51 asm volatile(LOCK_PREFIX "incl %0"
52 : "+m" (v->counter));
53 }
54
55
56
57
58
59
60
61
62
63 static inline int atomic_dec_and_test(atomic_t *v)
64 {
65 GEN_UNARY_RMWcc(LOCK_PREFIX "decl", v->counter, "%0", "e");
66 }
67
68 static __always_inline int atomic_cmpxchg(atomic_t *v, int old, int new)
69 {
70 return cmpxchg(&v->counter, old, new);
71 }
72
73 #endif