Implement "atomic_long_add_unless()" in the LinuxKPI and fix the
implementation of "atomic_long_inc_not_zero()". Found by: ngie @ MFC after: 1 week Sponsored by: Mellanox Technologies
This commit is contained in:
parent
ff55aa1f44
commit
44701cf732
@ -41,7 +41,7 @@ typedef struct {
|
|||||||
|
|
||||||
#define atomic_long_add(i, v) atomic_long_add_return((i), (v))
|
#define atomic_long_add(i, v) atomic_long_add_return((i), (v))
|
||||||
#define atomic_long_inc_return(v) atomic_long_add_return(1, (v))
|
#define atomic_long_inc_return(v) atomic_long_add_return(1, (v))
|
||||||
#define atomic_long_inc_not_zero(v) atomic_long_inc_not_zero(v)
|
#define atomic_long_inc_not_zero(v) atomic_long_add_unless((v), 1, 0)
|
||||||
|
|
||||||
static inline long
|
static inline long
|
||||||
atomic_long_add_return(long i, atomic_long_t *v)
|
atomic_long_add_return(long i, atomic_long_t *v)
|
||||||
@ -73,6 +73,21 @@ atomic_long_dec(atomic_long_t *v)
|
|||||||
return atomic_fetchadd_long(&v->counter, -1) - 1;
|
return atomic_fetchadd_long(&v->counter, -1) - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
atomic_long_add_unless(atomic_long_t *v, long a, long u)
|
||||||
|
{
|
||||||
|
long c;
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
c = atomic_long_read(v);
|
||||||
|
if (unlikely(c == u))
|
||||||
|
break;
|
||||||
|
if (likely(atomic_cmpset_long(&v->counter, c, c + a)))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return (c != u);
|
||||||
|
}
|
||||||
|
|
||||||
static inline long
|
static inline long
|
||||||
atomic_long_dec_and_test(atomic_long_t *v)
|
atomic_long_dec_and_test(atomic_long_t *v)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user