rodrigc 7ee1f8e3ab Sync XFS for FreeBSD tree with newer changes from SGI XFS for Linux tree.
Improve support for writing to XFS partitions.

Work done by:	Russell Cattelan <cattelan at xfs dot org>
2006-06-09 06:04:06 +00:00

37 lines
930 B
C

#ifndef __XFS_SUPPORT_ATOMIC_H__
#include <sys/types.h>
#include <machine/atomic.h>
typedef struct {
volatile unsigned int val;
} atomic_t;
#define atomic_read(v) ((v)->val)
#define atomic_set(v, i) ((v)->val = (i))
#define atomic_add(i, v) atomic_add_int(&(v)->val, (i))
#define atomic_inc(v) atomic_add_int(&(v)->val, 1)
#define atomic_dec(v) atomic_subtract_int(&(v)->val, 1)
#define atomic_sub(i, v) atomic_subtract_int(&(v)->val, (i))
#define atomic_dec_and_test(v) (atomic_fetchadd_int(&(v)->val, -1) == 1)
/*
* This is used for two variables in XFS, one of which is a debug trace
* buffer index.
*/
static __inline__ int atomicIncWithWrap(volatile unsigned int *ip, int val)
{
unsigned int oldval, newval;
do {
oldval = *ip;
newval = (oldval + 1 >= val) ? 0 : oldval + 1;
} while (atomic_cmpset_rel_int(ip, oldval, newval) == 0);
return oldval;
}
#endif /* __XFS_SUPPORT_ATOMIC_H__ */