Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at v4.13 71 lines 1.5 kB view raw
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#define cmpxchg(ptr, oldval, newval) \ 64 __sync_val_compare_and_swap(ptr, oldval, newval) 65 66static inline int atomic_cmpxchg(atomic_t *v, int oldval, int newval) 67{ 68 return cmpxchg(&(v)->counter, oldval, newval); 69} 70 71#endif /* __TOOLS_ASM_GENERIC_ATOMIC_H */