2009-06-13 01:10:05 +04:00
/*
* Generic implementation of 64 - bit atomics using spinlocks ,
* useful on processors that don ' t have 64 - bit atomic instructions .
*
* Copyright © 2009 Paul Mackerras , IBM Corp . < paulus @ au1 . ibm . com >
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version
* 2 of the License , or ( at your option ) any later version .
*/
# ifndef _ASM_GENERIC_ATOMIC64_H
# define _ASM_GENERIC_ATOMIC64_H
typedef struct {
long long counter ;
} atomic64_t ;
# define ATOMIC64_INIT(i) { (i) }
extern long long atomic64_read ( const atomic64_t * v ) ;
extern void atomic64_set ( atomic64_t * v , long long i ) ;
2014-04-23 18:12:30 +04:00
# define ATOMIC64_OP(op) \
extern void atomic64_ # # op ( long long a , atomic64_t * v ) ;
# define ATOMIC64_OP_RETURN(op) \
extern long long atomic64_ # # op # # _return ( long long a , atomic64_t * v ) ;
# define ATOMIC64_OPS(op) ATOMIC64_OP(op) ATOMIC64_OP_RETURN(op)
ATOMIC64_OPS ( add )
ATOMIC64_OPS ( sub )
2014-04-23 21:32:50 +04:00
ATOMIC64_OP ( and )
ATOMIC64_OP ( or )
ATOMIC64_OP ( xor )
2014-04-23 18:12:30 +04:00
# undef ATOMIC64_OPS
# undef ATOMIC64_OP_RETURN
# undef ATOMIC64_OP
2009-06-13 01:10:05 +04:00
extern long long atomic64_dec_if_positive ( atomic64_t * v ) ;
extern long long atomic64_cmpxchg ( atomic64_t * v , long long o , long long n ) ;
extern long long atomic64_xchg ( atomic64_t * v , long long new ) ;
extern int atomic64_add_unless ( atomic64_t * v , long long a , long long u ) ;
# define atomic64_add_negative(a, v) (atomic64_add_return((a), (v)) < 0)
# define atomic64_inc(v) atomic64_add(1LL, (v))
# define atomic64_inc_return(v) atomic64_add_return(1LL, (v))
# define atomic64_inc_and_test(v) (atomic64_inc_return(v) == 0)
# define atomic64_sub_and_test(a, v) (atomic64_sub_return((a), (v)) == 0)
# define atomic64_dec(v) atomic64_sub(1LL, (v))
# define atomic64_dec_return(v) atomic64_sub_return(1LL, (v))
# define atomic64_dec_and_test(v) (atomic64_dec_return((v)) == 0)
# define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1LL, 0LL)
# endif /* _ASM_GENERIC_ATOMIC64_H */