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 template<>
00098 inline void atomic_inc(unsigned long long volatile &val)
00099 { atomic_add_64((volatile uint64_t *)&val, 1); }
00100
00101 template<>
00102 inline void atomic_dec(int volatile &val)
00103 { atomic_add_int( (unsigned int volatile *)&val, -1); }
00104
00105
00106 template<>
00107 inline void atomic_dec(unsigned int volatile &val)
00108 { atomic_add_int(&val, -1); }
00109
00110 template<>
00111 inline void atomic_dec(unsigned long volatile &val)
00112 { atomic_add_long(&val, -1); }
00113
00114 template<>
00115 inline void atomic_dec(unsigned long long volatile &val)
00116 { atomic_add_64((volatile uint64_t *)&val, -1); }
00117
00118
00119 template<class T>
00120 T atomic_inc_nv(T volatile &val);
00121 template<class T>
00122 T atomic_dec_nv(T volatile &val);
00123
00124 template<>
00125 inline int atomic_inc_nv(int volatile &val)
00126 { return atomic_add_int_nv((unsigned int volatile*)&val, 1); }
00127 template<>
00128 inline unsigned int atomic_inc_nv(unsigned int volatile &val)
00129 { return atomic_add_int_nv(&val, 1); }
00130 template<>
00131 inline unsigned long atomic_inc_nv(unsigned long volatile &val)
00132 { return atomic_add_long_nv(&val, 1); }
00133 #ifndef ARCH_LP64
00134 inline unsigned long long atomic_inc_nv(unsigned long long volatile &val)
00135 { return atomic_add_64_nv(&val, 1); }
00136 #endif
00137
00138 template<>
00139 inline int atomic_dec_nv(int volatile &val)
00140 { return atomic_add_int_nv((unsigned int volatile*)&val, -1); }
00141 template<>
00142 inline unsigned int atomic_dec_nv(unsigned int volatile &val)
00143 { return atomic_add_int_nv(&val, -1); }
00144 template<>
00145 inline unsigned long atomic_dec_nv(unsigned long volatile &val)
00146 { return atomic_add_long_nv(&val, -1); }
00147 #ifndef ARCH_LP64
00148 inline unsigned long long atomic_dec_nv(unsigned long long volatile &val)
00149 { return atomic_add_64_nv(&val, -1); }
00150 #endif
00151
00152
00153
00154
00155 template<class T>
00156 void atomic_add_int_delta(T volatile &val, int delta);
00157
00158 template<>
00159 inline void atomic_add_int_delta(unsigned int volatile &val, int delta)
00160 { atomic_add_int(&val, delta); }
00161
00162 template<>
00163 inline void atomic_add_int_delta(int volatile &val, int delta)
00164 { atomic_add_int((unsigned int volatile*)&val, delta); }
00165
00166 template<>
00167 inline void atomic_add_int_delta(unsigned long volatile &val, int delta)
00168 { atomic_add_long(&val, delta); }
00169
00170 template<>
00171 inline void atomic_add_int_delta(long volatile &val, int delta)
00172 { atomic_add_long((unsigned long volatile*)&val, delta); }
00173
00174 #ifndef ARCH_LP64
00175
00176 template<>
00177 inline void atomic_add_int_delta(unsigned long long volatile &val, int delta)
00178 {
00179 int64_t deltalg=delta;
00180 atomic_add_64(&val, deltalg);
00181 }
00182
00183 template<>
00184 inline void atomic_add_int_delta(long long volatile &val, int delta)
00185 {
00186 int64_t deltalg=delta;
00187 atomic_add_64((unsigned long long volatile *)&val, deltalg);
00188 }
00189 #endif
00190
00191
00192
00193 template<class T>
00194 T atomic_add_nv_int_delta(T volatile &val, int delta);
00195
00196 template<>
00197 inline unsigned int atomic_add_nv_int_delta(unsigned int volatile &val, int delta)
00198 { return atomic_add_int_nv(&val, delta); }
00199
00200 template<>
00201 inline int atomic_add_nv_int_delta(int volatile &val, int delta)
00202 { return atomic_add_int_nv((unsigned int*) &val, delta); }
00203
00204 template<>
00205 inline unsigned long atomic_add_nv_int_delta(unsigned long volatile &val, int delta)
00206 { return atomic_add_long_nv(&val, delta); }
00207
00208 template<>
00209 inline long atomic_add_nv_int_delta(long volatile &val, int delta)
00210 { return atomic_add_long_nv((unsigned long*) &val, delta); }
00211
00212 #ifndef ARCH_LP64
00213
00214 template<>
00215 inline unsigned long long atomic_add_nv_int_delta(unsigned long long volatile &val, int delta)
00216 { return atomic_add_64_nv(&val, delta); }
00217
00218 template<>
00219 inline long long atomic_add_nv_int_delta(long long volatile &val, int delta)
00220 { return atomic_add_64_nv((unsigned long long *)&val, delta); }
00221
00222 #endif
00223
00224
00225
00226 template<class T>
00227 void atomic_add_long_delta(T volatile &val, long delta);
00228
00229 template<>
00230 inline void atomic_add_long_delta(unsigned int volatile &val, long delta)
00231 { atomic_add_int(&val, delta); }
00232
00233 template<>
00234 inline void atomic_add_long_delta(int volatile &val, long delta)
00235 { atomic_add_int((unsigned int volatile*)&val, delta); }
00236
00237 template<>
00238 inline void atomic_add_long_delta(unsigned long volatile &val, long delta)
00239 { atomic_add_long(&val, delta); }
00240
00241 template<>
00242 inline void atomic_add_long_delta(long volatile &val, long delta)
00243 { atomic_add_long((unsigned long volatile*)&val, delta); }
00244
00245 #ifndef ARCH_LP64
00246
00247 template<>
00248 inline void atomic_add_long_delta(unsigned long long volatile &val, long delta)
00249 {
00250 int64_t deltalg=delta;
00251 atomic_add_64(&val, deltalg);
00252 }
00253
00254 template<>
00255 inline void atomic_add_long_delta(long long volatile &val, long delta)
00256 {
00257 int64_t deltalg=delta;
00258 atomic_add_64((unsigned long long volatile *)&val, deltalg);
00259 }
00260 #endif
00261
00262
00263
00264 template<class T>
00265 T atomic_add_nv_long_delta(T volatile &val, long delta);
00266
00267 template<>
00268 inline unsigned int atomic_add_nv_long_delta(unsigned int volatile &val, long delta)
00269 { return atomic_add_int_nv(&val, delta); }
00270
00271 template<>
00272 inline int atomic_add_nv_long_delta(int volatile &val, long delta)
00273 { return atomic_add_int_nv((unsigned int*) &val, delta); }
00274
00275 template<>
00276 inline unsigned long atomic_add_nv_long_delta(unsigned long volatile &val, long delta)
00277 { return atomic_add_long_nv(&val, delta); }
00278
00279 template<>
00280 inline long atomic_add_nv_long_delta(long volatile &val, long delta)
00281 { return atomic_add_long_nv((unsigned long*) &val, delta); }
00282
00283 #ifndef ARCH_LP64
00284
00285 template<>
00286 inline unsigned long long atomic_add_nv_long_delta(unsigned long long volatile &val, long delta)
00287 { return atomic_add_64_nv(&val, delta); }
00288
00289 template<>
00290 inline long long atomic_add_nv_long_delta(long long volatile &val, long delta)
00291 { return atomic_add_64_nv((unsigned long long *)&val, delta); }
00292
00293 #endif
00294 #endif