Commit 52d38af5 authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

[PATCH] Implement atomic_inc_and_test() on various architectures

It's easy to do when the arch provides atomic_inc_return().
parent ebc7bc42
...@@ -50,6 +50,16 @@ static __inline__ int atomic_inc_return(atomic_t *v) ...@@ -50,6 +50,16 @@ static __inline__ int atomic_inc_return(atomic_t *v)
#define atomic_inc(v) atomic_inc_return(v) #define atomic_inc(v) atomic_inc_return(v)
/*
* atomic_inc_and_test - increment and test
* @v: pointer of type atomic_t
*
* Atomically increments @v by 1
* and returns true if the result is zero, or false for all
* other cases.
*/
#define atomic_inc_and_test(v) (atomic_inc_return(v) == 0)
static __inline__ int atomic_dec_return(atomic_t *v) static __inline__ int atomic_dec_return(atomic_t *v)
{ {
int ret,flags; int ret,flags;
......
...@@ -114,6 +114,16 @@ extern __inline__ int atomic_sub_return(int i, atomic_t * v) ...@@ -114,6 +114,16 @@ extern __inline__ int atomic_sub_return(int i, atomic_t * v)
#define atomic_dec_return(v) atomic_sub_return(1,(v)) #define atomic_dec_return(v) atomic_sub_return(1,(v))
#define atomic_inc_return(v) atomic_add_return(1,(v)) #define atomic_inc_return(v) atomic_add_return(1,(v))
/*
* atomic_inc_and_test - increment and test
* @v: pointer of type atomic_t
*
* Atomically increments @v by 1
* and returns true if the result is zero, or false for all
* other cases.
*/
#define atomic_inc_and_test(v) (atomic_inc_return(v) == 0)
#define atomic_sub_and_test(i,v) (atomic_sub_return((i), (v)) == 0) #define atomic_sub_and_test(i,v) (atomic_sub_return((i), (v)) == 0)
#define atomic_dec_and_test(v) (atomic_sub_return(1, (v)) == 0) #define atomic_dec_and_test(v) (atomic_sub_return(1, (v)) == 0)
......
...@@ -187,6 +187,16 @@ static __inline__ int atomic_read(const atomic_t *v) ...@@ -187,6 +187,16 @@ static __inline__ int atomic_read(const atomic_t *v)
#define atomic_add_negative(a, v) (atomic_add_return((a), (v)) < 0) #define atomic_add_negative(a, v) (atomic_add_return((a), (v)) < 0)
/*
* atomic_inc_and_test - increment and test
* @v: pointer of type atomic_t
*
* Atomically increments @v by 1
* and returns true if the result is zero, or false for all
* other cases.
*/
#define atomic_inc_and_test(v) (atomic_inc_return(v) == 0)
#define atomic_dec_and_test(v) (atomic_dec_return(v) == 0) #define atomic_dec_and_test(v) (atomic_dec_return(v) == 0)
#define ATOMIC_INIT(i) { (i) } #define ATOMIC_INIT(i) { (i) }
......
...@@ -134,6 +134,16 @@ static __inline__ int atomic_inc_return(atomic_t *v) ...@@ -134,6 +134,16 @@ static __inline__ int atomic_inc_return(atomic_t *v)
return t; return t;
} }
/*
* atomic_inc_and_test - increment and test
* @v: pointer of type atomic_t
*
* Atomically increments @v by 1
* and returns true if the result is zero, or false for all
* other cases.
*/
#define atomic_inc_and_test(v) (atomic_inc_return(v) == 0)
static __inline__ void atomic_dec(atomic_t *v) static __inline__ void atomic_dec(atomic_t *v)
{ {
int t; int t;
......
...@@ -120,6 +120,16 @@ static __inline__ int atomic_inc_return(atomic_t *v) ...@@ -120,6 +120,16 @@ static __inline__ int atomic_inc_return(atomic_t *v)
return t; return t;
} }
/*
* atomic_inc_and_test - increment and test
* @v: pointer of type atomic_t
*
* Atomically increments @v by 1
* and returns true if the result is zero, or false for all
* other cases.
*/
#define atomic_inc_and_test(v) (atomic_inc_return(v) == 0)
static __inline__ void atomic_dec(atomic_t *v) static __inline__ void atomic_dec(atomic_t *v)
{ {
int t; int t;
......
...@@ -69,6 +69,7 @@ static __inline__ int atomic_inc_return(volatile atomic_t * v) ...@@ -69,6 +69,7 @@ static __inline__ int atomic_inc_return(volatile atomic_t * v)
{ {
return __CS_LOOP(v, 1, "ar"); return __CS_LOOP(v, 1, "ar");
} }
static __inline__ int atomic_inc_and_test(volatile atomic_t * v) static __inline__ int atomic_inc_and_test(volatile atomic_t * v)
{ {
return __CS_LOOP(v, 1, "ar") != 0; return __CS_LOOP(v, 1, "ar") != 0;
......
...@@ -71,6 +71,16 @@ static __inline__ int atomic_sub_return(int i, atomic_t * v) ...@@ -71,6 +71,16 @@ static __inline__ int atomic_sub_return(int i, atomic_t * v)
#define atomic_dec_return(v) atomic_sub_return(1,(v)) #define atomic_dec_return(v) atomic_sub_return(1,(v))
#define atomic_inc_return(v) atomic_add_return(1,(v)) #define atomic_inc_return(v) atomic_add_return(1,(v))
/*
* atomic_inc_and_test - increment and test
* @v: pointer of type atomic_t
*
* Atomically increments @v by 1
* and returns true if the result is zero, or false for all
* other cases.
*/
#define atomic_inc_and_test(v) (atomic_inc_return(v) == 0)
#define atomic_sub_and_test(i,v) (atomic_sub_return((i), (v)) == 0) #define atomic_sub_and_test(i,v) (atomic_sub_return((i), (v)) == 0)
#define atomic_dec_and_test(v) (atomic_sub_return(1, (v)) == 0) #define atomic_dec_and_test(v) (atomic_sub_return(1, (v)) == 0)
......
...@@ -35,6 +35,16 @@ extern void atomic_set(atomic_t *, int); ...@@ -35,6 +35,16 @@ extern void atomic_set(atomic_t *, int);
#define atomic_add_negative(a, v) (atomic_add_return((a), (v)) < 0) #define atomic_add_negative(a, v) (atomic_add_return((a), (v)) < 0)
/*
* atomic_inc_and_test - increment and test
* @v: pointer of type atomic_t
*
* Atomically increments @v by 1
* and returns true if the result is zero, or false for all
* other cases.
*/
#define atomic_inc_and_test(v) (atomic_inc_return(v) == 0)
#define atomic_dec_and_test(v) (atomic_dec_return(v) == 0) #define atomic_dec_and_test(v) (atomic_dec_return(v) == 0)
/* This is the old 24-bit implementation. It's still used internally /* This is the old 24-bit implementation. It's still used internally
......
...@@ -40,6 +40,16 @@ extern int __atomic64_sub(__s64, atomic64_t *); ...@@ -40,6 +40,16 @@ extern int __atomic64_sub(__s64, atomic64_t *);
#define atomic_inc_return(v) __atomic_add(1, v) #define atomic_inc_return(v) __atomic_add(1, v)
#define atomic64_inc_return(v) __atomic64_add(1, v) #define atomic64_inc_return(v) __atomic64_add(1, v)
/*
* atomic_inc_and_test - increment and test
* @v: pointer of type atomic_t
*
* Atomically increments @v by 1
* and returns true if the result is zero, or false for all
* other cases.
*/
#define atomic_inc_and_test(v) (atomic_inc_return(v) == 0)
#define atomic_sub_and_test(i, v) (__atomic_sub(i, v) == 0) #define atomic_sub_and_test(i, v) (__atomic_sub(i, v) == 0)
#define atomic64_sub_and_test(i, v) (__atomic64_sub(i, v) == 0) #define atomic64_sub_and_test(i, v) (__atomic64_sub(i, v) == 0)
......
...@@ -76,6 +76,16 @@ static __inline__ void atomic_clear_mask (unsigned long mask, unsigned long *add ...@@ -76,6 +76,16 @@ static __inline__ void atomic_clear_mask (unsigned long mask, unsigned long *add
#define atomic_inc(v) atomic_inc_return (v) #define atomic_inc(v) atomic_inc_return (v)
#define atomic_dec(v) atomic_dec_return (v) #define atomic_dec(v) atomic_dec_return (v)
/*
* atomic_inc_and_test - increment and test
* @v: pointer of type atomic_t
*
* Atomically increments @v by 1
* and returns true if the result is zero, or false for all
* other cases.
*/
#define atomic_inc_and_test(v) (atomic_inc_return(v) == 0)
#define atomic_sub_and_test(i,v) (atomic_sub_return ((i), (v)) == 0) #define atomic_sub_and_test(i,v) (atomic_sub_return ((i), (v)) == 0)
#define atomic_dec_and_test(v) (atomic_sub_return (1, (v)) == 0) #define atomic_dec_and_test(v) (atomic_sub_return (1, (v)) == 0)
#define atomic_add_negative(i,v) (atomic_add_return ((i), (v)) < 0) #define atomic_add_negative(i,v) (atomic_add_return ((i), (v)) < 0)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment