It's easy to do when the arch provides atomic_inc_return(). --- 25-akpm/include/asm-h8300/atomic.h | 10 ++++++++++ 25-akpm/include/asm-m68knommu/atomic.h | 10 ++++++++++ 25-akpm/include/asm-parisc/atomic.h | 10 ++++++++++ 25-akpm/include/asm-ppc/atomic.h | 10 ++++++++++ 25-akpm/include/asm-ppc64/atomic.h | 10 ++++++++++ 25-akpm/include/asm-s390/atomic.h | 1 + 25-akpm/include/asm-sh/atomic.h | 10 ++++++++++ 25-akpm/include/asm-sparc/atomic.h | 10 ++++++++++ 25-akpm/include/asm-sparc64/atomic.h | 10 ++++++++++ 25-akpm/include/asm-v850/atomic.h | 10 ++++++++++ 10 files changed, 91 insertions(+) diff -puN include/asm-h8300/atomic.h~arch-atomic_inc_and_test include/asm-h8300/atomic.h --- 25/include/asm-h8300/atomic.h~arch-atomic_inc_and_test 2004-05-13 02:10:06.441179672 -0700 +++ 25-akpm/include/asm-h8300/atomic.h 2004-05-13 02:10:06.456177392 -0700 @@ -50,6 +50,16 @@ static __inline__ int atomic_inc_return( #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) { int ret,flags; diff -puN include/asm-m68knommu/atomic.h~arch-atomic_inc_and_test include/asm-m68knommu/atomic.h --- 25/include/asm-m68knommu/atomic.h~arch-atomic_inc_and_test 2004-05-13 02:10:06.442179520 -0700 +++ 25-akpm/include/asm-m68knommu/atomic.h 2004-05-13 02:10:06.457177240 -0700 @@ -114,6 +114,16 @@ extern __inline__ int atomic_sub_return( #define atomic_dec_return(v) atomic_sub_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_dec_and_test(v) (atomic_sub_return(1, (v)) == 0) diff -puN include/asm-parisc/atomic.h~arch-atomic_inc_and_test include/asm-parisc/atomic.h --- 25/include/asm-parisc/atomic.h~arch-atomic_inc_and_test 2004-05-13 02:10:06.443179368 -0700 +++ 25-akpm/include/asm-parisc/atomic.h 2004-05-13 02:10:06.457177240 -0700 @@ -187,6 +187,16 @@ static __inline__ int atomic_read(const #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_INIT(i) { (i) } diff -puN include/asm-ppc64/atomic.h~arch-atomic_inc_and_test include/asm-ppc64/atomic.h --- 25/include/asm-ppc64/atomic.h~arch-atomic_inc_and_test 2004-05-13 02:10:06.445179064 -0700 +++ 25-akpm/include/asm-ppc64/atomic.h 2004-05-13 02:10:06.458177088 -0700 @@ -120,6 +120,16 @@ static __inline__ int atomic_inc_return( 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) { int t; diff -puN include/asm-ppc/atomic.h~arch-atomic_inc_and_test include/asm-ppc/atomic.h --- 25/include/asm-ppc/atomic.h~arch-atomic_inc_and_test 2004-05-13 02:10:06.446178912 -0700 +++ 25-akpm/include/asm-ppc/atomic.h 2004-05-13 02:10:06.458177088 -0700 @@ -134,6 +134,16 @@ static __inline__ int atomic_inc_return( 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) { int t; diff -puN include/asm-s390/atomic.h~arch-atomic_inc_and_test include/asm-s390/atomic.h --- 25/include/asm-s390/atomic.h~arch-atomic_inc_and_test 2004-05-13 02:10:06.448178608 -0700 +++ 25-akpm/include/asm-s390/atomic.h 2004-05-13 02:10:06.458177088 -0700 @@ -69,6 +69,7 @@ static __inline__ int atomic_inc_return( { return __CS_LOOP(v, 1, "ar"); } + static __inline__ int atomic_inc_and_test(volatile atomic_t * v) { return __CS_LOOP(v, 1, "ar") != 0; diff -puN include/asm-sh/atomic.h~arch-atomic_inc_and_test include/asm-sh/atomic.h --- 25/include/asm-sh/atomic.h~arch-atomic_inc_and_test 2004-05-13 02:10:06.450178304 -0700 +++ 25-akpm/include/asm-sh/atomic.h 2004-05-13 02:10:06.459176936 -0700 @@ -71,6 +71,16 @@ static __inline__ int atomic_sub_return( #define atomic_dec_return(v) atomic_sub_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_dec_and_test(v) (atomic_sub_return(1, (v)) == 0) diff -puN include/asm-sparc64/atomic.h~arch-atomic_inc_and_test include/asm-sparc64/atomic.h --- 25/include/asm-sparc64/atomic.h~arch-atomic_inc_and_test 2004-05-13 02:10:06.451178152 -0700 +++ 25-akpm/include/asm-sparc64/atomic.h 2004-05-13 02:10:06.459176936 -0700 @@ -40,6 +40,16 @@ extern int __atomic64_sub(__s64, atomic6 #define atomic_inc_return(v) __atomic_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 atomic64_sub_and_test(i, v) (__atomic64_sub(i, v) == 0) diff -puN include/asm-sparc/atomic.h~arch-atomic_inc_and_test include/asm-sparc/atomic.h --- 25/include/asm-sparc/atomic.h~arch-atomic_inc_and_test 2004-05-13 02:10:06.452178000 -0700 +++ 25-akpm/include/asm-sparc/atomic.h 2004-05-13 02:10:06.460176784 -0700 @@ -35,6 +35,16 @@ extern void atomic_set(atomic_t *, int); #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) /* This is the old 24-bit implementation. It's still used internally diff -puN include/asm-v850/atomic.h~arch-atomic_inc_and_test include/asm-v850/atomic.h --- 25/include/asm-v850/atomic.h~arch-atomic_inc_and_test 2004-05-13 02:10:06.453177848 -0700 +++ 25-akpm/include/asm-v850/atomic.h 2004-05-13 02:10:06.460176784 -0700 @@ -76,6 +76,16 @@ static __inline__ void atomic_clear_mask #define atomic_inc(v) atomic_inc_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_dec_and_test(v) (atomic_sub_return (1, (v)) == 0) #define atomic_add_negative(i,v) (atomic_add_return ((i), (v)) < 0) _