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:
Hans Petter Selasky 2016-05-23 16:19:51 +00:00
parent ff55aa1f44
commit 44701cf732

View File

@ -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)
{