linux/tools/testing/selftests/futex/include/atomic.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-or-later */
   2/******************************************************************************
   3 *
   4 *   Copyright © International Business Machines  Corp., 2009
   5 *
   6 * DESCRIPTION
   7 *      GCC atomic builtin wrappers
   8 *      http://gcc.gnu.org/onlinedocs/gcc-4.1.0/gcc/Atomic-Builtins.html
   9 *
  10 * AUTHOR
  11 *      Darren Hart <dvhart@linux.intel.com>
  12 *
  13 * HISTORY
  14 *      2009-Nov-17: Initial version by Darren Hart <dvhart@linux.intel.com>
  15 *
  16 *****************************************************************************/
  17
  18#ifndef _ATOMIC_H
  19#define _ATOMIC_H
  20
  21typedef struct {
  22        volatile int val;
  23} atomic_t;
  24
  25#define ATOMIC_INITIALIZER { 0 }
  26
  27/**
  28 * atomic_cmpxchg() - Atomic compare and exchange
  29 * @uaddr:      The address of the futex to be modified
  30 * @oldval:     The expected value of the futex
  31 * @newval:     The new value to try and assign the futex
  32 *
  33 * Return the old value of addr->val.
  34 */
  35static inline int
  36atomic_cmpxchg(atomic_t *addr, int oldval, int newval)
  37{
  38        return __sync_val_compare_and_swap(&addr->val, oldval, newval);
  39}
  40
  41/**
  42 * atomic_inc() - Atomic incrememnt
  43 * @addr:       Address of the variable to increment
  44 *
  45 * Return the new value of addr->val.
  46 */
  47static inline int
  48atomic_inc(atomic_t *addr)
  49{
  50        return __sync_add_and_fetch(&addr->val, 1);
  51}
  52
  53/**
  54 * atomic_dec() - Atomic decrement
  55 * @addr:       Address of the variable to decrement
  56 *
  57 * Return the new value of addr-val.
  58 */
  59static inline int
  60atomic_dec(atomic_t *addr)
  61{
  62        return __sync_sub_and_fetch(&addr->val, 1);
  63}
  64
  65/**
  66 * atomic_set() - Atomic set
  67 * @addr:       Address of the variable to set
  68 * @newval:     New value for the atomic_t
  69 *
  70 * Return the new value of addr->val.
  71 */
  72static inline int
  73atomic_set(atomic_t *addr, int newval)
  74{
  75        addr->val = newval;
  76        return newval;
  77}
  78
  79#endif
  80