2006-01-06 11:11:20 +03:00
# ifndef _ASM_GENERIC_ATOMIC_H
# define _ASM_GENERIC_ATOMIC_H
/*
* Copyright ( C ) 2005 Silicon Graphics , Inc .
* Christoph Lameter < clameter @ sgi . com >
*
* Allows to provide arch independent atomic definitions without the need to
* edit all arch specific atomic . h files .
*/
2006-01-08 12:00:29 +03:00
# include <asm/types.h>
2006-01-06 11:11:20 +03:00
/*
* Suppport for atomic_long_t
*
* Casts for parameters are avoided for existing atomic functions in order to
* avoid issues with cast - as - lval under gcc 4. x and other limitations that the
* macros of a platform may have .
*/
# if BITS_PER_LONG == 64
typedef atomic64_t atomic_long_t ;
# define ATOMIC_LONG_INIT(i) ATOMIC64_INIT(i)
static inline long atomic_long_read ( atomic_long_t * l )
{
atomic64_t * v = ( atomic64_t * ) l ;
return ( long ) atomic64_read ( v ) ;
}
static inline void atomic_long_set ( atomic_long_t * l , long i )
{
atomic64_t * v = ( atomic64_t * ) l ;
2006-01-15 20:10:55 +03:00
atomic64_set ( v , i ) ;
2006-01-06 11:11:20 +03:00
}
static inline void atomic_long_inc ( atomic_long_t * l )
{
atomic64_t * v = ( atomic64_t * ) l ;
atomic64_inc ( v ) ;
}
static inline void atomic_long_dec ( atomic_long_t * l )
{
atomic64_t * v = ( atomic64_t * ) l ;
atomic64_dec ( v ) ;
}
static inline void atomic_long_add ( long i , atomic_long_t * l )
{
atomic64_t * v = ( atomic64_t * ) l ;
atomic64_add ( i , v ) ;
}
static inline void atomic_long_sub ( long i , atomic_long_t * l )
{
atomic64_t * v = ( atomic64_t * ) l ;
atomic64_sub ( i , v ) ;
}
2007-05-08 11:34:19 +04:00
static inline int atomic_long_sub_and_test ( long i , atomic_long_t * l )
{
atomic64_t * v = ( atomic64_t * ) l ;
return atomic64_sub_and_test ( i , v ) ;
}
static inline int atomic_long_dec_and_test ( atomic_long_t * l )
{
atomic64_t * v = ( atomic64_t * ) l ;
return atomic64_dec_and_test ( v ) ;
}
static inline int atomic_long_inc_and_test ( atomic_long_t * l )
{
atomic64_t * v = ( atomic64_t * ) l ;
return atomic64_inc_and_test ( v ) ;
}
static inline int atomic_long_add_negative ( long i , atomic_long_t * l )
{
atomic64_t * v = ( atomic64_t * ) l ;
return atomic64_add_negative ( i , v ) ;
}
static inline long atomic_long_add_return ( long i , atomic_long_t * l )
{
atomic64_t * v = ( atomic64_t * ) l ;
return ( long ) atomic64_add_return ( i , v ) ;
}
static inline long atomic_long_sub_return ( long i , atomic_long_t * l )
{
atomic64_t * v = ( atomic64_t * ) l ;
return ( long ) atomic64_sub_return ( i , v ) ;
}
static inline long atomic_long_inc_return ( atomic_long_t * l )
{
atomic64_t * v = ( atomic64_t * ) l ;
return ( long ) atomic64_inc_return ( v ) ;
}
static inline long atomic_long_dec_return ( atomic_long_t * l )
{
atomic64_t * v = ( atomic64_t * ) l ;
return ( long ) atomic64_dec_return ( v ) ;
}
2007-05-08 11:34:38 +04:00
static inline long atomic_long_add_unless ( atomic_long_t * l , long a , long u )
{
atomic64_t * v = ( atomic64_t * ) l ;
return ( long ) atomic64_add_unless ( v , a , u ) ;
}
2007-05-08 11:34:19 +04:00
# define atomic_long_inc_not_zero(l) atomic64_inc_not_zero((atomic64_t *)(l))
# define atomic_long_cmpxchg(l, old, new) \
( atomic_cmpxchg ( ( atomic64_t * ) ( l ) , ( old ) , ( new ) ) )
# define atomic_long_xchg(v, new) \
( atomic_xchg ( ( atomic64_t * ) ( l ) , ( new ) ) )
2006-12-07 07:40:28 +03:00
# else /* BITS_PER_LONG == 64 */
2006-01-06 11:11:20 +03:00
typedef atomic_t atomic_long_t ;
# define ATOMIC_LONG_INIT(i) ATOMIC_INIT(i)
static inline long atomic_long_read ( atomic_long_t * l )
{
atomic_t * v = ( atomic_t * ) l ;
return ( long ) atomic_read ( v ) ;
}
static inline void atomic_long_set ( atomic_long_t * l , long i )
{
atomic_t * v = ( atomic_t * ) l ;
atomic_set ( v , i ) ;
}
static inline void atomic_long_inc ( atomic_long_t * l )
{
atomic_t * v = ( atomic_t * ) l ;
atomic_inc ( v ) ;
}
static inline void atomic_long_dec ( atomic_long_t * l )
{
atomic_t * v = ( atomic_t * ) l ;
atomic_dec ( v ) ;
}
static inline void atomic_long_add ( long i , atomic_long_t * l )
{
atomic_t * v = ( atomic_t * ) l ;
atomic_add ( i , v ) ;
}
static inline void atomic_long_sub ( long i , atomic_long_t * l )
{
atomic_t * v = ( atomic_t * ) l ;
atomic_sub ( i , v ) ;
}
2007-05-08 11:34:19 +04:00
static inline int atomic_long_sub_and_test ( long i , atomic_long_t * l )
{
atomic_t * v = ( atomic_t * ) l ;
return atomic_sub_and_test ( i , v ) ;
}
static inline int atomic_long_dec_and_test ( atomic_long_t * l )
{
atomic_t * v = ( atomic_t * ) l ;
return atomic_dec_and_test ( v ) ;
}
static inline int atomic_long_inc_and_test ( atomic_long_t * l )
{
atomic_t * v = ( atomic_t * ) l ;
return atomic_inc_and_test ( v ) ;
}
static inline int atomic_long_add_negative ( long i , atomic_long_t * l )
{
atomic_t * v = ( atomic_t * ) l ;
return atomic_add_negative ( i , v ) ;
}
static inline long atomic_long_add_return ( long i , atomic_long_t * l )
{
atomic_t * v = ( atomic_t * ) l ;
return ( long ) atomic_add_return ( i , v ) ;
}
static inline long atomic_long_sub_return ( long i , atomic_long_t * l )
{
atomic_t * v = ( atomic_t * ) l ;
return ( long ) atomic_sub_return ( i , v ) ;
}
static inline long atomic_long_inc_return ( atomic_long_t * l )
{
atomic_t * v = ( atomic_t * ) l ;
return ( long ) atomic_inc_return ( v ) ;
}
static inline long atomic_long_dec_return ( atomic_long_t * l )
{
atomic_t * v = ( atomic_t * ) l ;
return ( long ) atomic_dec_return ( v ) ;
}
2007-05-08 11:34:38 +04:00
static inline long atomic_long_add_unless ( atomic_long_t * l , long a , long u )
{
atomic_t * v = ( atomic_t * ) l ;
return ( long ) atomic_add_unless ( v , a , u ) ;
}
2007-05-08 11:34:19 +04:00
# define atomic_long_inc_not_zero(l) atomic_inc_not_zero((atomic_t *)(l))
# define atomic_long_cmpxchg(l, old, new) \
( atomic_cmpxchg ( ( atomic_t * ) ( l ) , ( old ) , ( new ) ) )
# define atomic_long_xchg(v, new) \
( atomic_xchg ( ( atomic_t * ) ( l ) , ( new ) ) )
2006-12-07 07:40:28 +03:00
# endif /* BITS_PER_LONG == 64 */
# endif /* _ASM_GENERIC_ATOMIC_H */