Rev 5270 | Rev 6934 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5270 | serge | 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 |
||
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) |
||
6082 | serge | 26 | #define ATOMIC_LONG_PFX(x) atomic64 ## x |
5270 | serge | 27 | |
6082 | serge | 28 | #else |
5270 | serge | 29 | |
6082 | serge | 30 | typedef atomic_t atomic_long_t; |
5270 | serge | 31 | |
6082 | serge | 32 | #define ATOMIC_LONG_INIT(i) ATOMIC_INIT(i) |
33 | #define ATOMIC_LONG_PFX(x) atomic ## x |
||
5270 | serge | 34 | |
6082 | serge | 35 | #endif |
5270 | serge | 36 | |
6082 | serge | 37 | #define ATOMIC_LONG_READ_OP(mo) \ |
38 | static inline long atomic_long_read##mo(const atomic_long_t *l) \ |
||
39 | { \ |
||
40 | ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l; \ |
||
41 | \ |
||
42 | return (long)ATOMIC_LONG_PFX(_read##mo)(v); \ |
||
5270 | serge | 43 | } |
6082 | serge | 44 | ATOMIC_LONG_READ_OP() |
45 | ATOMIC_LONG_READ_OP(_acquire) |
||
5270 | serge | 46 | |
6082 | serge | 47 | #undef ATOMIC_LONG_READ_OP |
5270 | serge | 48 | |
6082 | serge | 49 | #define ATOMIC_LONG_SET_OP(mo) \ |
50 | static inline void atomic_long_set##mo(atomic_long_t *l, long i) \ |
||
51 | { \ |
||
52 | ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l; \ |
||
53 | \ |
||
54 | ATOMIC_LONG_PFX(_set##mo)(v, i); \ |
||
5270 | serge | 55 | } |
6082 | serge | 56 | ATOMIC_LONG_SET_OP() |
57 | ATOMIC_LONG_SET_OP(_release) |
||
5270 | serge | 58 | |
6082 | serge | 59 | #undef ATOMIC_LONG_SET_OP |
5270 | serge | 60 | |
6082 | serge | 61 | #define ATOMIC_LONG_ADD_SUB_OP(op, mo) \ |
62 | static inline long \ |
||
63 | atomic_long_##op##_return##mo(long i, atomic_long_t *l) \ |
||
64 | { \ |
||
65 | ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l; \ |
||
66 | \ |
||
67 | return (long)ATOMIC_LONG_PFX(_##op##_return##mo)(i, v); \ |
||
5270 | serge | 68 | } |
6082 | serge | 69 | ATOMIC_LONG_ADD_SUB_OP(add,) |
70 | ATOMIC_LONG_ADD_SUB_OP(add, _relaxed) |
||
71 | ATOMIC_LONG_ADD_SUB_OP(add, _acquire) |
||
72 | ATOMIC_LONG_ADD_SUB_OP(add, _release) |
||
73 | ATOMIC_LONG_ADD_SUB_OP(sub,) |
||
74 | ATOMIC_LONG_ADD_SUB_OP(sub, _relaxed) |
||
75 | ATOMIC_LONG_ADD_SUB_OP(sub, _acquire) |
||
76 | ATOMIC_LONG_ADD_SUB_OP(sub, _release) |
||
5270 | serge | 77 | |
6082 | serge | 78 | #undef ATOMIC_LONG_ADD_SUB_OP |
5270 | serge | 79 | |
6082 | serge | 80 | #define atomic_long_cmpxchg_relaxed(l, old, new) \ |
81 | (ATOMIC_LONG_PFX(_cmpxchg_relaxed)((ATOMIC_LONG_PFX(_t) *)(l), \ |
||
82 | (old), (new))) |
||
83 | #define atomic_long_cmpxchg_acquire(l, old, new) \ |
||
84 | (ATOMIC_LONG_PFX(_cmpxchg_acquire)((ATOMIC_LONG_PFX(_t) *)(l), \ |
||
85 | (old), (new))) |
||
86 | #define atomic_long_cmpxchg_release(l, old, new) \ |
||
87 | (ATOMIC_LONG_PFX(_cmpxchg_release)((ATOMIC_LONG_PFX(_t) *)(l), \ |
||
88 | (old), (new))) |
||
89 | #define atomic_long_cmpxchg(l, old, new) \ |
||
90 | (ATOMIC_LONG_PFX(_cmpxchg)((ATOMIC_LONG_PFX(_t) *)(l), (old), (new))) |
||
5270 | serge | 91 | |
6082 | serge | 92 | #define atomic_long_xchg_relaxed(v, new) \ |
93 | (ATOMIC_LONG_PFX(_xchg_relaxed)((ATOMIC_LONG_PFX(_t) *)(v), (new))) |
||
94 | #define atomic_long_xchg_acquire(v, new) \ |
||
95 | (ATOMIC_LONG_PFX(_xchg_acquire)((ATOMIC_LONG_PFX(_t) *)(v), (new))) |
||
96 | #define atomic_long_xchg_release(v, new) \ |
||
97 | (ATOMIC_LONG_PFX(_xchg_release)((ATOMIC_LONG_PFX(_t) *)(v), (new))) |
||
5270 | serge | 98 | #define atomic_long_xchg(v, new) \ |
6082 | serge | 99 | (ATOMIC_LONG_PFX(_xchg)((ATOMIC_LONG_PFX(_t) *)(v), (new))) |
5270 | serge | 100 | |
101 | static inline void atomic_long_inc(atomic_long_t *l) |
||
102 | { |
||
6082 | serge | 103 | ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l; |
5270 | serge | 104 | |
6082 | serge | 105 | ATOMIC_LONG_PFX(_inc)(v); |
5270 | serge | 106 | } |
107 | |||
108 | static inline void atomic_long_dec(atomic_long_t *l) |
||
109 | { |
||
6082 | serge | 110 | ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l; |
5270 | serge | 111 | |
6082 | serge | 112 | ATOMIC_LONG_PFX(_dec)(v); |
5270 | serge | 113 | } |
114 | |||
6082 | serge | 115 | #define ATOMIC_LONG_OP(op) \ |
116 | static inline void \ |
||
117 | atomic_long_##op(long i, atomic_long_t *l) \ |
||
118 | { \ |
||
119 | ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l; \ |
||
120 | \ |
||
121 | ATOMIC_LONG_PFX(_##op)(i, v); \ |
||
5270 | serge | 122 | } |
123 | |||
6082 | serge | 124 | ATOMIC_LONG_OP(add) |
125 | ATOMIC_LONG_OP(sub) |
||
126 | ATOMIC_LONG_OP(and) |
||
127 | ATOMIC_LONG_OP(or) |
||
128 | ATOMIC_LONG_OP(xor) |
||
129 | ATOMIC_LONG_OP(andnot) |
||
5270 | serge | 130 | |
6082 | serge | 131 | #undef ATOMIC_LONG_OP |
5270 | serge | 132 | |
133 | static inline int atomic_long_sub_and_test(long i, atomic_long_t *l) |
||
134 | { |
||
6082 | serge | 135 | ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l; |
5270 | serge | 136 | |
6082 | serge | 137 | return ATOMIC_LONG_PFX(_sub_and_test)(i, v); |
5270 | serge | 138 | } |
139 | |||
140 | static inline int atomic_long_dec_and_test(atomic_long_t *l) |
||
141 | { |
||
6082 | serge | 142 | ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l; |
5270 | serge | 143 | |
6082 | serge | 144 | return ATOMIC_LONG_PFX(_dec_and_test)(v); |
5270 | serge | 145 | } |
146 | |||
147 | static inline int atomic_long_inc_and_test(atomic_long_t *l) |
||
148 | { |
||
6082 | serge | 149 | ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l; |
5270 | serge | 150 | |
6082 | serge | 151 | return ATOMIC_LONG_PFX(_inc_and_test)(v); |
5270 | serge | 152 | } |
153 | |||
154 | static inline int atomic_long_add_negative(long i, atomic_long_t *l) |
||
155 | { |
||
6082 | serge | 156 | ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l; |
5270 | serge | 157 | |
6082 | serge | 158 | return ATOMIC_LONG_PFX(_add_negative)(i, v); |
5270 | serge | 159 | } |
160 | |||
6082 | serge | 161 | #define ATOMIC_LONG_INC_DEC_OP(op, mo) \ |
162 | static inline long \ |
||
163 | atomic_long_##op##_return##mo(atomic_long_t *l) \ |
||
164 | { \ |
||
165 | ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l; \ |
||
166 | \ |
||
167 | return (long)ATOMIC_LONG_PFX(_##op##_return##mo)(v); \ |
||
5270 | serge | 168 | } |
6082 | serge | 169 | ATOMIC_LONG_INC_DEC_OP(inc,) |
170 | ATOMIC_LONG_INC_DEC_OP(inc, _relaxed) |
||
171 | ATOMIC_LONG_INC_DEC_OP(inc, _acquire) |
||
172 | ATOMIC_LONG_INC_DEC_OP(inc, _release) |
||
173 | ATOMIC_LONG_INC_DEC_OP(dec,) |
||
174 | ATOMIC_LONG_INC_DEC_OP(dec, _relaxed) |
||
175 | ATOMIC_LONG_INC_DEC_OP(dec, _acquire) |
||
176 | ATOMIC_LONG_INC_DEC_OP(dec, _release) |
||
5270 | serge | 177 | |
6082 | serge | 178 | #undef ATOMIC_LONG_INC_DEC_OP |
5270 | serge | 179 | |
180 | static inline long atomic_long_add_unless(atomic_long_t *l, long a, long u) |
||
181 | { |
||
6082 | serge | 182 | ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l; |
5270 | serge | 183 | |
6082 | serge | 184 | return (long)ATOMIC_LONG_PFX(_add_unless)(v, a, u); |
5270 | serge | 185 | } |
186 | |||
6082 | serge | 187 | #define atomic_long_inc_not_zero(l) \ |
188 | ATOMIC_LONG_PFX(_inc_not_zero)((ATOMIC_LONG_PFX(_t) *)(l)) |
||
5270 | serge | 189 | |
190 | #endif /* _ASM_GENERIC_ATOMIC_LONG_H */ |