Branch data Line data Source code
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 : :
23 : : typedef atomic64_t atomic_long_t;
24 : :
25 : : #define ATOMIC_LONG_INIT(i) ATOMIC64_INIT(i)
26 : :
27 : : static 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 : :
34 : : static 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 : :
41 : : static inline void atomic_long_inc(atomic_long_t *l)
42 : : {
43 : : atomic64_t *v = (atomic64_t *)l;
44 : :
45 : : atomic64_inc(v);
46 : : }
47 : :
48 : : static inline void atomic_long_dec(atomic_long_t *l)
49 : : {
50 : : atomic64_t *v = (atomic64_t *)l;
51 : :
52 : : atomic64_dec(v);
53 : : }
54 : :
55 : : static 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 : :
62 : : static 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 : :
69 : : static 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 : :
76 : : static 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 : :
83 : : static 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 : :
90 : : static 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 : :
97 : : static 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 : :
104 : : static 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 : :
111 : : static 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 : :
118 : : static 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 : :
125 : : static 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 : :
141 : : typedef atomic_t atomic_long_t;
142 : :
143 : : #define ATOMIC_LONG_INIT(i) ATOMIC_INIT(i)
144 : : static inline long atomic_long_read(atomic_long_t *l)
145 : : {
146 : : atomic_t *v = (atomic_t *)l;
147 : :
148 : 130831358 : return (long)atomic_read(v);
149 : : }
150 : :
151 : : static inline void atomic_long_set(atomic_long_t *l, long i)
152 : : {
153 : : atomic_t *v = (atomic_t *)l;
154 : :
155 : 10879144 : atomic_set(v, i);
156 : : }
157 : :
158 : : static inline void atomic_long_inc(atomic_long_t *l)
159 : : {
160 : : atomic_t *v = (atomic_t *)l;
161 : :
162 : : atomic_inc(v);
163 : : }
164 : :
165 : : static inline void atomic_long_dec(atomic_long_t *l)
166 : : {
167 : : atomic_t *v = (atomic_t *)l;
168 : :
169 : : atomic_dec(v);
170 : : }
171 : :
172 : : static 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 : :
179 : : static 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 : :
186 : : static 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 : :
193 : : static 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 : :
200 : : static 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 : :
207 : : static 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 : :
214 : : static 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 : :
221 : : static 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 : :
228 : : static 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 : :
235 : : static 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 : :
242 : : static 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 */
|