You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
63 lines
1.3 KiB
63 lines
1.3 KiB
#ifndef __TOOLS_ASM_GENERIC_ATOMIC_H |
|
#define __TOOLS_ASM_GENERIC_ATOMIC_H |
|
|
|
#include <linux/compiler.h> |
|
#include <linux/types.h> |
|
|
|
/* |
|
* Atomic operations that C can't guarantee us. Useful for |
|
* resource counting etc.. |
|
* |
|
* Excerpts obtained from the Linux kernel sources. |
|
*/ |
|
|
|
#define ATOMIC_INIT(i) { (i) } |
|
|
|
/** |
|
* atomic_read - read atomic variable |
|
* @v: pointer of type atomic_t |
|
* |
|
* Atomically reads the value of @v. |
|
*/ |
|
static inline int atomic_read(const atomic_t *v) |
|
{ |
|
return ACCESS_ONCE((v)->counter); |
|
} |
|
|
|
/** |
|
* atomic_set - set atomic variable |
|
* @v: pointer of type atomic_t |
|
* @i: required value |
|
* |
|
* Atomically sets the value of @v to @i. |
|
*/ |
|
static inline void atomic_set(atomic_t *v, int i) |
|
{ |
|
v->counter = i; |
|
} |
|
|
|
/** |
|
* atomic_inc - increment atomic variable |
|
* @v: pointer of type atomic_t |
|
* |
|
* Atomically increments @v by 1. |
|
*/ |
|
static inline void atomic_inc(atomic_t *v) |
|
{ |
|
__sync_add_and_fetch(&v->counter, 1); |
|
} |
|
|
|
/** |
|
* atomic_dec_and_test - decrement and test |
|
* @v: pointer of type atomic_t |
|
* |
|
* Atomically decrements @v by 1 and |
|
* returns true if the result is 0, or false for all other |
|
* cases. |
|
*/ |
|
static inline int atomic_dec_and_test(atomic_t *v) |
|
{ |
|
return __sync_sub_and_fetch(&v->counter, 1) == 0; |
|
} |
|
|
|
#endif /* __TOOLS_ASM_GENERIC_ATOMIC_H */
|
|
|