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 */ 64