diff options
author | Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca> | 2007-05-08 03:34:26 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-05-08 14:15:19 -0400 |
commit | 8ffe9d0bffa441de41d8543a984e552d49293641 (patch) | |
tree | 051ebf19cd050298545a46649673f4877ac5301b /include/asm-parisc/atomic.h | |
parent | e12f644bd085ce64a6ecca4e466fcdc2c2df4c0f (diff) |
atomic.h: add atomic64 cmpxchg, xchg and add_unless to parisc
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
Cc: Kyle McMartin <kyle@mcmartin.ca>
Cc: Matthew Wilcox <willy@debian.org>
Acked-by: Grant Grundler <grundler@parisc-linux.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include/asm-parisc/atomic.h')
-rw-r--r-- | include/asm-parisc/atomic.h | 29 |
1 files changed, 26 insertions, 3 deletions
diff --git a/include/asm-parisc/atomic.h b/include/asm-parisc/atomic.h index 7d57d34fcca8..66a0edbb51f4 100644 --- a/include/asm-parisc/atomic.h +++ b/include/asm-parisc/atomic.h | |||
@@ -6,7 +6,6 @@ | |||
6 | #define _ASM_PARISC_ATOMIC_H_ | 6 | #define _ASM_PARISC_ATOMIC_H_ |
7 | 7 | ||
8 | #include <linux/types.h> | 8 | #include <linux/types.h> |
9 | #include <asm/system.h> | ||
10 | 9 | ||
11 | /* | 10 | /* |
12 | * Atomic operations that C can't guarantee us. Useful for | 11 | * Atomic operations that C can't guarantee us. Useful for |
@@ -163,7 +162,7 @@ static __inline__ int atomic_read(const atomic_t *v) | |||
163 | } | 162 | } |
164 | 163 | ||
165 | /* exported interface */ | 164 | /* exported interface */ |
166 | #define atomic_cmpxchg(v, o, n) ((int)cmpxchg(&((v)->counter), (o), (n))) | 165 | #define atomic_cmpxchg(v, o, n) (cmpxchg(&((v)->counter), (o), (n))) |
167 | #define atomic_xchg(v, new) (xchg(&((v)->counter), new)) | 166 | #define atomic_xchg(v, new) (xchg(&((v)->counter), new)) |
168 | 167 | ||
169 | /** | 168 | /** |
@@ -177,7 +176,7 @@ static __inline__ int atomic_read(const atomic_t *v) | |||
177 | */ | 176 | */ |
178 | #define atomic_add_unless(v, a, u) \ | 177 | #define atomic_add_unless(v, a, u) \ |
179 | ({ \ | 178 | ({ \ |
180 | int c, old; \ | 179 | __typeof__((v)->counter) c, old; \ |
181 | c = atomic_read(v); \ | 180 | c = atomic_read(v); \ |
182 | while (c != (u) && (old = atomic_cmpxchg((v), c, c + (a))) != c) \ | 181 | while (c != (u) && (old = atomic_cmpxchg((v), c, c + (a))) != c) \ |
183 | c = old; \ | 182 | c = old; \ |
@@ -270,6 +269,30 @@ atomic64_read(const atomic64_t *v) | |||
270 | #define atomic64_dec_and_test(v) (atomic64_dec_return(v) == 0) | 269 | #define atomic64_dec_and_test(v) (atomic64_dec_return(v) == 0) |
271 | #define atomic64_sub_and_test(i,v) (atomic64_sub_return((i),(v)) == 0) | 270 | #define atomic64_sub_and_test(i,v) (atomic64_sub_return((i),(v)) == 0) |
272 | 271 | ||
272 | /* exported interface */ | ||
273 | #define atomic64_cmpxchg(v, o, n) \ | ||
274 | ((__typeof__((v)->counter))cmpxchg(&((v)->counter), (o), (n))) | ||
275 | #define atomic64_xchg(v, new) (xchg(&((v)->counter), new)) | ||
276 | |||
277 | /** | ||
278 | * atomic64_add_unless - add unless the number is a given value | ||
279 | * @v: pointer of type atomic64_t | ||
280 | * @a: the amount to add to v... | ||
281 | * @u: ...unless v is equal to u. | ||
282 | * | ||
283 | * Atomically adds @a to @v, so long as it was not @u. | ||
284 | * Returns non-zero if @v was not @u, and zero otherwise. | ||
285 | */ | ||
286 | #define atomic64_add_unless(v, a, u) \ | ||
287 | ({ \ | ||
288 | __typeof__((v)->counter) c, old; \ | ||
289 | c = atomic64_read(v); \ | ||
290 | while (c != (u) && (old = atomic64_cmpxchg((v), c, c + (a))) != c) \ | ||
291 | c = old; \ | ||
292 | c != (u); \ | ||
293 | }) | ||
294 | #define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0) | ||
295 | |||
273 | #endif /* CONFIG_64BIT */ | 296 | #endif /* CONFIG_64BIT */ |
274 | 297 | ||
275 | #include <asm-generic/atomic.h> | 298 | #include <asm-generic/atomic.h> |