atomic: add atomic_add_unless()
authorLionel Landwerlin <lionel.g.landwerlin@intel.com>
Fri, 12 Sep 2014 12:48:35 +0000 (13:48 +0100)
committerDamien Lespiau <damien.lespiau@intel.com>
Mon, 15 Sep 2014 13:50:47 +0000 (14:50 +0100)
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>
xf86atomic.h

index db2f619..bc482c9 100644 (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