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