Go to the documentation of this file. 1 #ifndef _ARCH_MIPS_LOCAL_H
2 #define _ARCH_MIPS_LOCAL_H
5 #include <linux/bitops.h>
7 #include <asm/cmpxchg.h>
15 #define LOCAL_INIT(i) { ATOMIC_LONG_INIT(i) }
17 #define local_read(l) atomic_long_read(&(l)->a)
18 #define local_set(l, i) atomic_long_set(&(l)->a, (i))
20 #define local_add(i, l) atomic_long_add((i), (&(l)->a))
21 #define local_sub(i, l) atomic_long_sub((i), (&(l)->a))
22 #define local_inc(l) atomic_long_inc(&(l)->a)
23 #define local_dec(l) atomic_long_dec(&(l)->a)
37 "1:" __LL
"%1, %2 # local_add_return \n"
43 :
"=&r" (result),
"=&r" (temp),
"=m" (l->
a.
counter)
51 "1:" __LL
"%1, %2 # local_add_return \n"
57 :
"=&r" (result),
"=&r" (temp),
"=m" (l->
a.
counter)
82 "1:" __LL
"%1, %2 # local_sub_return \n"
88 :
"=&r" (result),
"=&r" (temp),
"=m" (l->
a.
counter)
96 "1:" __LL
"%1, %2 # local_sub_return \n"
100 " subu %0, %1, %3 \n"
102 :
"=&r" (result),
"=&r" (temp),
"=m" (l->
a.
counter)
118 #define local_cmpxchg(l, o, n) \
119 ((long)cmpxchg_local(&((l)->a.counter), (o), (n)))
120 #define local_xchg(l, n) (atomic_long_xchg((&(l)->a), (n)))
131 #define local_add_unless(l, a, u) \
135 while (c != (u) && (old = local_cmpxchg((l), c, c + (a))) != c) \
139 #define local_inc_not_zero(l) local_add_unless((l), 1, 0)
141 #define local_dec_return(l) local_sub_return(1, (l))
142 #define local_inc_return(l) local_add_return(1, (l))
153 #define local_sub_and_test(i, l) (local_sub_return((i), (l)) == 0)
163 #define local_inc_and_test(l) (local_inc_return(l) == 0)
173 #define local_dec_and_test(l) (local_sub_return(1, (l)) == 0)
184 #define local_add_negative(i, l) (local_add_return(i, (l)) < 0)
191 #define __local_inc(l) ((l)->a.counter++)
192 #define __local_dec(l) ((l)->a.counter++)
193 #define __local_add(i, l) ((l)->a.counter+=(i))
194 #define __local_sub(i, l) ((l)->a.counter-=(i))