root/tools/include/asm-generic/atomic-gcc.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. atomic_read
  2. atomic_set
  3. atomic_inc
  4. atomic_dec_and_test
  5. atomic_cmpxchg

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

/* [<][>][^][v][top][bottom][index][help] */