00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068 #ifndef ATOMIC_TEMPLATES_H
00069 #define ATOMIC_TEMPLATES_H
00070
00071 #include "atomic_ops.h"
00072
00073
00074
00075
00076
00077
00078
00079
00080 template<class T>
00081 void atomic_inc(T volatile &val);
00082 template<class T>
00083 void atomic_dec(T volatile &val);
00084
00085 template<>
00086 inline void atomic_inc(int volatile &val)
00087 { atomic_add_int( (unsigned int volatile *)&val, 1); }
00088
00089 template<>
00090 inline void atomic_inc(unsigned int volatile &val)
00091 { atomic_add_int(&val, 1); }
00092
00093 template<>
00094 inline void atomic_inc(unsigned long volatile &val)
00095 { atomic_add_long(&val, 1); }
00096
00097 #if defined(ARCH_LP64)
00098
00099 #elif defined(__GNUG__)
00100
00101 template<>
00102 inline void atomic_inc(unsigned long long volatile &val)
00103 { atomic_add_64((volatile uint64_t *)&val, 1); }
00104 #else
00105 #error int8_t Not supported for this compiler.
00106 #endif
00107
00108 template<>
00109 inline void atomic_dec(int volatile &val)
00110 { atomic_add_int( (unsigned int volatile *)&val, -1); }
00111
00112
00113 template<>
00114 inline void atomic_dec(unsigned int volatile &val)
00115 { atomic_add_int(&val, -1); }
00116
00117 template<>
00118 inline void atomic_dec(unsigned long volatile &val)
00119 { atomic_add_long(&val, -1); }
00120
00121 #if defined(ARCH_LP64)
00122
00123 #elif defined(__GNUG__)
00124
00125 template<>
00126 inline void atomic_dec(unsigned long long volatile &val)
00127 { atomic_add_64((volatile uint64_t *)&val, -1); }
00128 #else
00129 #error int8_t Not supported for this compiler.
00130 #endif
00131
00132 template<class T>
00133 T atomic_inc_nv(T volatile &val);
00134 template<class T>
00135 T atomic_dec_nv(T volatile &val);
00136
00137 template<>
00138 inline int atomic_inc_nv(int volatile &val)
00139 { return atomic_add_int_nv((unsigned int volatile*)&val, 1); }
00140 template<>
00141 inline unsigned int atomic_inc_nv(unsigned int volatile &val)
00142 { return atomic_add_int_nv(&val, 1); }
00143 template<>
00144 inline unsigned long atomic_inc_nv(unsigned long volatile &val)
00145 { return atomic_add_long_nv(&val, 1); }
00146 #if defined(ARCH_LP64)
00147
00148 #elif defined(__GNUG__)
00149
00150 inline unsigned long long atomic_inc_nv(unsigned long long volatile &val)
00151 { return atomic_add_64_nv(&val, 1); }
00152 #else
00153 #error int8_t Not supported for this compiler.
00154 #endif
00155
00156 template<>
00157 inline int atomic_dec_nv(int volatile &val)
00158 { return atomic_add_int_nv((unsigned int volatile*)&val, -1); }
00159 template<>
00160 inline unsigned int atomic_dec_nv(unsigned int volatile &val)
00161 { return atomic_add_int_nv(&val, -1); }
00162 template<>
00163 inline unsigned long atomic_dec_nv(unsigned long volatile &val)
00164 { return atomic_add_long_nv(&val, -1); }
00165
00166 #if defined(ARCH_LP64)
00167
00168 #elif defined(__GNUG__)
00169
00170 inline unsigned long long atomic_dec_nv(unsigned long long volatile &val)
00171 { return atomic_add_64_nv(&val, -1); }
00172 #else
00173 #error int8_t Not supported for this compiler.
00174 #endif
00175
00176
00177
00178
00179 template<class T>
00180 void atomic_add_int_delta(T volatile &val, int delta);
00181
00182 template<>
00183 inline void atomic_add_int_delta(unsigned int volatile &val, int delta)
00184 { atomic_add_int(&val, delta); }
00185
00186 template<>
00187 inline void atomic_add_int_delta(int volatile &val, int delta)
00188 { atomic_add_int((unsigned int volatile*)&val, delta); }
00189
00190 template<>
00191 inline void atomic_add_int_delta(unsigned long volatile &val, int delta)
00192 { atomic_add_long(&val, delta); }
00193
00194 template<>
00195 inline void atomic_add_int_delta(long volatile &val, int delta)
00196 { atomic_add_long((unsigned long volatile*)&val, delta); }
00197
00198 #if defined(ARCH_LP64)
00199
00200 #elif defined(__GNUG__)
00201
00202 template<>
00203 inline void atomic_add_int_delta(unsigned long long volatile &val, int delta)
00204 {
00205 int64_t deltalg=delta;
00206 atomic_add_64(&val, deltalg);
00207 }
00208
00209 template<>
00210 inline void atomic_add_int_delta(long long volatile &val, int delta)
00211 {
00212 int64_t deltalg=delta;
00213 atomic_add_64((unsigned long long volatile *)&val, deltalg);
00214 }
00215 #else
00216 #error int8_t Not supported for this compiler.
00217 #endif
00218
00219
00220
00221 template<class T>
00222 T atomic_add_nv_int_delta(T volatile &val, int delta);
00223
00224 template<>
00225 inline unsigned int atomic_add_nv_int_delta(unsigned int volatile &val, int delta)
00226 { return atomic_add_int_nv(&val, delta); }
00227
00228 template<>
00229 inline int atomic_add_nv_int_delta(int volatile &val, int delta)
00230 { return atomic_add_int_nv((unsigned int*) &val, delta); }
00231
00232 template<>
00233 inline unsigned long atomic_add_nv_int_delta(unsigned long volatile &val, int delta)
00234 { return atomic_add_long_nv(&val, delta); }
00235
00236 template<>
00237 inline long atomic_add_nv_int_delta(long volatile &val, int delta)
00238 { return atomic_add_long_nv((unsigned long*) &val, delta); }
00239
00240 #if defined(ARCH_LP64)
00241
00242 #elif defined(__GNUG__)
00243
00244 template<>
00245 inline unsigned long long atomic_add_nv_int_delta(unsigned long long volatile &val, int delta)
00246 { return atomic_add_64_nv(&val, delta); }
00247
00248 template<>
00249 inline long long atomic_add_nv_int_delta(long long volatile &val, int delta)
00250 { return atomic_add_64_nv((unsigned long long *)&val, delta); }
00251 #else
00252 #error int8_t Not supported for this compiler.
00253 #endif
00254
00255
00256 template<class T>
00257 void atomic_add_long_delta(T volatile &val, long delta);
00258
00259 template<>
00260 inline void atomic_add_long_delta(unsigned int volatile &val, long delta)
00261 { atomic_add_int(&val, delta); }
00262
00263 template<>
00264 inline void atomic_add_long_delta(int volatile &val, long delta)
00265 { atomic_add_int((unsigned int volatile*)&val, delta); }
00266
00267 template<>
00268 inline void atomic_add_long_delta(unsigned long volatile &val, long delta)
00269 { atomic_add_long(&val, delta); }
00270
00271 template<>
00272 inline void atomic_add_long_delta(long volatile &val, long delta)
00273 { atomic_add_long((unsigned long volatile*)&val, delta); }
00274
00275 #if defined(ARCH_LP64)
00276
00277 #elif defined(__GNUG__)
00278
00279
00280 template<>
00281 inline void atomic_add_long_delta(unsigned long long volatile &val, long delta)
00282 {
00283 int64_t deltalg=delta;
00284 atomic_add_64(&val, deltalg);
00285 }
00286
00287 template<>
00288 inline void atomic_add_long_delta(long long volatile &val, long delta)
00289 {
00290 int64_t deltalg=delta;
00291 atomic_add_64((unsigned long long volatile *)&val, deltalg);
00292 }
00293 #else
00294 #error int8_t Not supported for this compiler.
00295 #endif
00296
00297
00298
00299 template<class T>
00300 T atomic_add_nv_long_delta(T volatile &val, long delta);
00301
00302 template<>
00303 inline unsigned int atomic_add_nv_long_delta(unsigned int volatile &val, long delta)
00304 { return atomic_add_int_nv(&val, delta); }
00305
00306 template<>
00307 inline int atomic_add_nv_long_delta(int volatile &val, long delta)
00308 { return atomic_add_int_nv((unsigned int*) &val, delta); }
00309
00310 template<>
00311 inline unsigned long atomic_add_nv_long_delta(unsigned long volatile &val, long delta)
00312 { return atomic_add_long_nv(&val, delta); }
00313
00314 template<>
00315 inline long atomic_add_nv_long_delta(long volatile &val, long delta)
00316 { return atomic_add_long_nv((unsigned long*) &val, delta); }
00317
00318 #if defined(ARCH_LP64)
00319
00320 #elif defined(__GNUG__)
00321
00322 template<>
00323 inline unsigned long long atomic_add_nv_long_delta(unsigned long long volatile &val, long delta)
00324 { return atomic_add_64_nv(&val, delta); }
00325
00326 template<>
00327 inline long long atomic_add_nv_long_delta(long long volatile &val, long delta)
00328 { return atomic_add_64_nv((unsigned long long *)&val, delta); }
00329 #else
00330 #error int8_t Not supported for this compiler.
00331 #endif
00332
00333 #endif