1#ifndef _ASM_GENERIC_ATOMIC_LONG_H 2#define _ASM_GENERIC_ATOMIC_LONG_H 3/* 4 * Copyright (C) 2005 Silicon Graphics, Inc. 5 * Christoph Lameter 6 * 7 * Allows to provide arch independent atomic definitions without the need to 8 * edit all arch specific atomic.h files. 9 */ 10 11#include <asm/types.h> 12 13/* 14 * Suppport for atomic_long_t 15 * 16 * Casts for parameters are avoided for existing atomic functions in order to 17 * avoid issues with cast-as-lval under gcc 4.x and other limitations that the 18 * macros of a platform may have. 19 */ 20 21#if BITS_PER_LONG == 64 22 23typedef atomic64_t atomic_long_t; 24 25#define ATOMIC_LONG_INIT(i) ATOMIC64_INIT(i) 26 27static inline long atomic_long_read(atomic_long_t *l) 28{ 29 atomic64_t *v = (atomic64_t *)l; 30 31 return (long)atomic64_read(v); 32} 33 34static inline void atomic_long_set(atomic_long_t *l, long i) 35{ 36 atomic64_t *v = (atomic64_t *)l; 37 38 atomic64_set(v, i); 39} 40 41static inline void atomic_long_inc(atomic_long_t *l) 42{ 43 atomic64_t *v = (atomic64_t *)l; 44 45 atomic64_inc(v); 46} 47 48static inline void atomic_long_dec(atomic_long_t *l) 49{ 50 atomic64_t *v = (atomic64_t *)l; 51 52 atomic64_dec(v); 53} 54 55static inline void atomic_long_add(long i, atomic_long_t *l) 56{ 57 atomic64_t *v = (atomic64_t *)l; 58 59 atomic64_add(i, v); 60} 61 62static inline void atomic_long_sub(long i, atomic_long_t *l) 63{ 64 atomic64_t *v = (atomic64_t *)l; 65 66 atomic64_sub(i, v); 67} 68 69static inline int atomic_long_sub_and_test(long i, atomic_long_t *l) 70{ 71 atomic64_t *v = (atomic64_t *)l; 72 73 return atomic64_sub_and_test(i, v); 74} 75 76static inline int atomic_long_dec_and_test(atomic_long_t *l) 77{ 78 atomic64_t *v = (atomic64_t *)l; 79 80 return atomic64_dec_and_test(v); 81} 82 83static inline int atomic_long_inc_and_test(atomic_long_t *l) 84{ 85 atomic64_t *v = (atomic64_t *)l; 86 87 return atomic64_inc_and_test(v); 88} 89 90static inline int atomic_long_add_negative(long i, atomic_long_t *l) 91{ 92 atomic64_t *v = (atomic64_t *)l; 93 94 return atomic64_add_negative(i, v); 95} 96 97static inline long atomic_long_add_return(long i, atomic_long_t *l) 98{ 99 atomic64_t *v = (atomic64_t *)l; 100 101 return (long)atomic64_add_return(i, v); 102} 103 104static inline long atomic_long_sub_return(long i, atomic_long_t *l) 105{ 106 atomic64_t *v = (atomic64_t *)l; 107 108 return (long)atomic64_sub_return(i, v); 109} 110 111static inline long atomic_long_inc_return(atomic_long_t *l) 112{ 113 atomic64_t *v = (atomic64_t *)l; 114 115 return (long)atomic64_inc_return(v); 116} 117 118static inline long atomic_long_dec_return(atomic_long_t *l) 119{ 120 atomic64_t *v = (atomic64_t *)l; 121 122 return (long)atomic64_dec_return(v); 123} 124 125static inline long atomic_long_add_unless(atomic_long_t *l, long a, long u) 126{ 127 atomic64_t *v = (atomic64_t *)l; 128 129 return (long)atomic64_add_unless(v, a, u); 130} 131 132#define atomic_long_inc_not_zero(l) atomic64_inc_not_zero((atomic64_t *)(l)) 133 134#define atomic_long_cmpxchg(l, old, new) \ 135 (atomic64_cmpxchg((atomic64_t *)(l), (old), (new))) 136#define atomic_long_xchg(v, new) \ 137 (atomic64_xchg((atomic64_t *)(v), (new))) 138 139#else /* BITS_PER_LONG == 64 */ 140 141typedef atomic_t atomic_long_t; 142 143#define ATOMIC_LONG_INIT(i) ATOMIC_INIT(i) 144static inline long atomic_long_read(atomic_long_t *l) 145{ 146 atomic_t *v = (atomic_t *)l; 147 148 return (long)atomic_read(v); 149} 150 151static inline void atomic_long_set(atomic_long_t *l, long i) 152{ 153 atomic_t *v = (atomic_t *)l; 154 155 atomic_set(v, i); 156} 157 158static inline void atomic_long_inc(atomic_long_t *l) 159{ 160 atomic_t *v = (atomic_t *)l; 161 162 atomic_inc(v); 163} 164 165static inline void atomic_long_dec(atomic_long_t *l) 166{ 167 atomic_t *v = (atomic_t *)l; 168 169 atomic_dec(v); 170} 171 172static inline void atomic_long_add(long i, atomic_long_t *l) 173{ 174 atomic_t *v = (atomic_t *)l; 175 176 atomic_add(i, v); 177} 178 179static inline void atomic_long_sub(long i, atomic_long_t *l) 180{ 181 atomic_t *v = (atomic_t *)l; 182 183 atomic_sub(i, v); 184} 185 186static inline int atomic_long_sub_and_test(long i, atomic_long_t *l) 187{ 188 atomic_t *v = (atomic_t *)l; 189 190 return atomic_sub_and_test(i, v); 191} 192 193static inline int atomic_long_dec_and_test(atomic_long_t *l) 194{ 195 atomic_t *v = (atomic_t *)l; 196 197 return atomic_dec_and_test(v); 198} 199 200static inline int atomic_long_inc_and_test(atomic_long_t *l) 201{ 202 atomic_t *v = (atomic_t *)l; 203 204 return atomic_inc_and_test(v); 205} 206 207static inline int atomic_long_add_negative(long i, atomic_long_t *l) 208{ 209 atomic_t *v = (atomic_t *)l; 210 211 return atomic_add_negative(i, v); 212} 213 214static inline long atomic_long_add_return(long i, atomic_long_t *l) 215{ 216 atomic_t *v = (atomic_t *)l; 217 218 return (long)atomic_add_return(i, v); 219} 220 221static inline long atomic_long_sub_return(long i, atomic_long_t *l) 222{ 223 atomic_t *v = (atomic_t *)l; 224 225 return (long)atomic_sub_return(i, v); 226} 227 228static inline long atomic_long_inc_return(atomic_long_t *l) 229{ 230 atomic_t *v = (atomic_t *)l; 231 232 return (long)atomic_inc_return(v); 233} 234 235static inline long atomic_long_dec_return(atomic_long_t *l) 236{ 237 atomic_t *v = (atomic_t *)l; 238 239 return (long)atomic_dec_return(v); 240} 241 242static inline long atomic_long_add_unless(atomic_long_t *l, long a, long u) 243{ 244 atomic_t *v = (atomic_t *)l; 245 246 return (long)atomic_add_unless(v, a, u); 247} 248 249#define atomic_long_inc_not_zero(l) atomic_inc_not_zero((atomic_t *)(l)) 250 251#define atomic_long_cmpxchg(l, old, new) \ 252 (atomic_cmpxchg((atomic_t *)(l), (old), (new))) 253#define atomic_long_xchg(v, new) \ 254 (atomic_xchg((atomic_t *)(v), (new))) 255 256#endif /* BITS_PER_LONG == 64 */ 257 258#endif /* _ASM_GENERIC_ATOMIC_LONG_H */ 259