1#ifndef __XFS_SUPPORT_ATOMIC_H__ 2 3#include <sys/types.h> 4#include <machine/atomic.h> 5 6typedef struct { 7 volatile unsigned int val; 8} atomic_t; 9 10#define atomic_read(v) ((v)->val) 11#define atomic_set(v, i) ((v)->val = (i)) 12 13#define atomic_add(i, v) atomic_add_int(&(v)->val, (i)) 14#define atomic_inc(v) atomic_add_int(&(v)->val, 1) 15#define atomic_dec(v) atomic_subtract_int(&(v)->val, 1) 16#define atomic_sub(i, v) atomic_subtract_int(&(v)->val, (i)) 17#define atomic_dec_and_test(v) (atomic_fetchadd_int(&(v)->val, -1) == 1) 18 19/* 20 * This is used for two variables in XFS, one of which is a debug trace 21 * buffer index. 22 */ 23 24static __inline__ int atomicIncWithWrap(volatile unsigned int *ip, int val) 25{ 26 unsigned int oldval, newval; 27 28 do { 29 oldval = *ip; 30 newval = (oldval + 1 >= val) ? 0 : oldval + 1; 31 } while (atomic_cmpset_rel_int(ip, oldval, newval) == 0); 32 33 return oldval; 34} 35 36#endif /* __XFS_SUPPORT_ATOMIC_H__ */ 37