aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLionel Landwerlin2014-09-12 07:48:35 -0500
committerDamien Lespiau2014-09-15 08:50:47 -0500
commit63fc571863aa646834004fae2a8aee1326b775dc (patch)
treefa81323735b903d95068a7491e472065916fd39b /xf86atomic.h
parent8c2ae1695913990cbe6c6a8aa294f354eba33bd0 (diff)
downloadexternal-libdrm-63fc571863aa646834004fae2a8aee1326b775dc.tar.gz
external-libdrm-63fc571863aa646834004fae2a8aee1326b775dc.tar.xz
external-libdrm-63fc571863aa646834004fae2a8aee1326b775dc.zip
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>
Diffstat (limited to 'xf86atomic.h')
-rw-r--r--xf86atomic.h9
1 files changed, 9 insertions, 0 deletions
diff --git a/xf86atomic.h b/xf86atomic.h
index db2f6195..bc482c92 100644
--- a/xf86atomic.h
+++ b/xf86atomic.h
@@ -96,4 +96,13 @@ typedef struct { uint_t atomic; } atomic_t;
96#error libdrm requires atomic operations, please define them for your CPU/compiler. 96#error libdrm requires atomic operations, please define them for your CPU/compiler.
97#endif 97#endif
98 98
99static inline int atomic_add_unless(atomic_t *v, int add, int unless)
100{
101 int c, old;
102 c = atomic_read(v);
103 while (c != unless && (old = atomic_cmpxchg(v, c, c + add)) != c)
104 c = old;
105 return c == unless;
106}
107
99#endif 108#endif