00001 #ifndef QPID_SYS_ATOMICVALUE_MUTEX_H
00002 #define QPID_SYS_ATOMICVALUE_MUTEX_H
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #if !defined(QPID_SYS_ATOMICVALUE_H)
00026 #error "This file should only be included via AtomicValue.h."
00027 #endif
00028
00029 #include "qpid/sys/Mutex.h"
00030
00031 namespace qpid {
00032 namespace sys {
00033
00038 template <class T>
00039 class AtomicValue
00040 {
00041 public:
00042 AtomicValue(T init=0) : value(init) {}
00043
00044
00045 inline T operator+=(T n) { Lock l(lock); return value += n; }
00046 inline T operator-=(T n) { Lock l(lock); return value -= n; }
00047 inline T operator++() { return *this += 1; }
00048 inline T operator--() { return *this -= 1; }
00049
00050
00051 inline T fetchAndAdd(T n) { Lock l(lock); T old=value; value += n; return old; }
00052 inline T fetchAndSub(T n) { Lock l(lock); T old=value; value -= n; return old; }
00053 inline T operator++(int) { return fetchAndAdd(1); }
00054 inline T operator--(int) { return fetchAndSub(1); }
00055
00057 T valueCompareAndSwap(T testval, T newval) {
00058 Lock l(lock);
00059 T old=value;
00060 if (value == testval) value = newval;
00061 return old;
00062 }
00063
00065 bool boolCompareAndSwap(T testval, T newval) {
00066 Lock l(lock);
00067 if (value == testval) { value = newval; return true; }
00068 return false;
00069 }
00070
00071 T get() const { Lock l(lock); return value; }
00072
00073 private:
00074 typedef Mutex::ScopedLock Lock;
00075 T value;
00076 mutable Mutex lock;
00077 };
00078
00079 }}
00080
00081 #endif