atomic.h (1781B)
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