From 63fc571863aa646834004fae2a8aee1326b775dc Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin Date: Fri, 12 Sep 2014 13:48:35 +0100 Subject: [PATCH] atomic: add atomic_add_unless() Reviewed-by: Chris Wilson Signed-off-by: Damien Lespiau Signed-off-by: Lionel Landwerlin --- xf86atomic.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/xf86atomic.h b/xf86atomic.h index db2f619..bc482c9 100644 --- a/xf86atomic.h +++ b/xf86atomic.h @@ -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 -- 2.7.4