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 */ 22static 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 */ 34static 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 */ 45static 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 */ 58static 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