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_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
|
||||
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;
|
||||
}
|
||||
|
||||
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
|
||||
atomic_long_dec_and_test(atomic_long_t *v)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user