diff options
author | Lionel Landwerlin | 2014-09-12 07:48:35 -0500 |
---|---|---|
committer | Damien Lespiau | 2014-09-15 08:50:47 -0500 |
commit | 63fc571863aa646834004fae2a8aee1326b775dc (patch) | |
tree | fa81323735b903d95068a7491e472065916fd39b | |
parent | 8c2ae1695913990cbe6c6a8aa294f354eba33bd0 (diff) | |
download | external-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>
-rw-r--r-- | xf86atomic.h | 9 |
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 | ||
99 | static 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 |