linux/tools/include/asm-generic/atomic-gcc.h
<<
>>
Prefs
   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 */
  23static 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 */
  35static 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 */
  46static 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 */
  59static 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
  67static 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 */
  73