00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef _INCLUDE_SYNCEDINT_H_
00012 #define _INCLUDE_SYNCEDINT_H_
00013
00014 #include <drift/Mutex.h>
00015
00026 template <class T>
00027 class SyncedInt {
00028 #if defined(WIN32)
00029 private:
00030 T * value;
00031 public:
00032 SyncedInt() {
00033 value = (T *)_aligned_malloc(sizeof(T), 64);
00034 *value = 0;
00035 }
00036 ~SyncedInt() {
00037 _aligned_free(value);
00038 }
00039 T Increment() {
00040 if (sizeof(T) == 4) {
00041 return InterlockedIncrement((LONG *)value);
00042 #if (_WIN32_WINNT >= 0x0600)
00043 } else if (sizeof(T) == 8) {
00044 return InterlockedIncrement64((LONGLONG *)value);
00045 #endif
00046 #if (_WIN32_WINNT >= 0x0602)
00047 } else if (sizeof(T) == 2) {
00048 return InterlockedIncrement16((LONGLONG *)value);
00049 #endif
00050 } else {
00051 printf("SyncedInt: Unsupported int size: %u\n", sizeof(T));
00052 }
00053 return -1;
00054 }
00055 T Decrement() {
00056 if (sizeof(T) == 4) {
00057 return InterlockedDecrement((LONG *)value);
00058 #if (_WIN32_WINNT >= 0x0600)
00059 } else if (sizeof(T) == 8) {
00060 return InterlockedDecrement64((LONGLONG *)value);
00061 #endif
00062 #if (_WIN32_WINNT >= 0x0602)
00063 } else if (sizeof(T) == 2) {
00064 return InterlockedDecrement16((LONGLONG *)value);
00065 #endif
00066 } else {
00067 printf("SyncedInt: Unsupported int size: %u\n", sizeof(T));
00068 }
00069 return -1;
00070 }
00071 T Get() { return *value; }
00072 #else
00073 private:
00074 T __attribute__((aligned(64))) value;
00075 public:
00076 SyncedInt() {
00077 value = 0;
00078 }
00079 T Increment() {
00080 return __sync_add_and_fetch(&value, 1);
00081 }
00082 T Decrement() {
00083 return __sync_sub_and_fetch(&value, 1);
00084 }
00085 T Get() { return value; }
00086 #endif
00087 };
00088
00091 #endif // _INCLUDE_SYNCEDINT_H_