atomic: add atomic_add_unless()

Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Damien Lespiau <damien.lespiau@intel.com>
Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
main
Lionel Landwerlin 2014-09-12 13:48:35 +01:00 committed by Damien Lespiau
parent 8c2ae16959
commit 63fc571863
1 changed files with 9 additions and 0 deletions

View File

@ -96,4 +96,13 @@ typedef struct { uint_t atomic; } atomic_t;
#error libdrm requires atomic operations, please define them for your CPU/compiler.
#endif
static inline int atomic_add_unless(atomic_t *v, int add, int unless)
{
int c, old;
c = atomic_read(v);
while (c != unless && (old = atomic_cmpxchg(v, c, c + add)) != c)
c = old;
return c == unless;
}
#endif