Commit | Line | Data |
---|---|---|
da6d8567 ACM |
1 | #ifndef __TOOLS_ASM_GENERIC_ATOMIC_H |
2 | #define __TOOLS_ASM_GENERIC_ATOMIC_H | |
3 | ||
4 | #include <linux/compiler.h> | |
5 | #include <linux/types.h> | |
6 | ||
7 | /* | |
8 | * Atomic operations that C can't guarantee us. Useful for | |
9 | * resource counting etc.. | |
10 | * | |
11 | * Excerpts obtained from the Linux kernel sources. | |
12 | */ | |
13 | ||
14 | #define ATOMIC_INIT(i) { (i) } | |
15 | ||
16 | /** | |
17 | * atomic_read - read atomic variable | |
18 | * @v: pointer of type atomic_t | |
19 | * | |
20 | * Atomically reads the value of @v. | |
21 | */ | |
22 | static inline int atomic_read(const atomic_t *v) | |
23 | { | |
24 | return ACCESS_ONCE((v)->counter); | |
25 | } | |
26 | ||
27 | /** | |
28 | * atomic_set - set atomic variable | |
29 | * @v: pointer of type atomic_t | |
30 | * @i: required value | |
31 | * | |
32 | * Atomically sets the value of @v to @i. | |
33 | */ | |
34 | static inline void atomic_set(atomic_t *v, int i) | |
35 | { | |
36 | v->counter = i; | |
37 | } | |
38 | ||
39 | /** | |
40 | * atomic_inc - increment atomic variable | |
41 | * @v: pointer of type atomic_t | |
42 | * | |
43 | * Atomically increments @v by 1. | |
44 | */ | |
45 | static inline void atomic_inc(atomic_t *v) | |
46 | { | |
47 | __sync_add_and_fetch(&v->counter, 1); | |
48 | } | |
49 | ||
50 | /** | |
51 | * atomic_dec_and_test - decrement and test | |
52 | * @v: pointer of type atomic_t | |
53 | * | |
54 | * Atomically decrements @v by 1 and | |
55 | * returns true if the result is 0, or false for all other | |
56 | * cases. | |
57 | */ | |
58 | static inline int atomic_dec_and_test(atomic_t *v) | |
59 | { | |
60 | return __sync_sub_and_fetch(&v->counter, 1) == 0; | |
61 | } | |
62 | ||
63 | #endif /* __TOOLS_ASM_GENERIC_ATOMIC_H */ |