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
00031
00032 #pragma once
00033
00034 #ifndef WIN32
00035 #include "../IOData/datatypes.h"
00036 #endif
00037
00041 class CL_InterlockedVariable
00042 {
00043 public:
00044 CL_InterlockedVariable()
00045 {
00046 set(0);
00047 }
00048
00049 #ifdef WIN32
00050 LONG get()
00051 {
00052 return InterlockedCompareExchange(&val, 0, 0);
00053 }
00054
00055 void set(LONG new_value)
00056 {
00057 InterlockedExchange(&val, new_value);
00058 }
00059
00060 LONG increment()
00061 {
00062 return InterlockedIncrement(&val);
00063 }
00064
00065 LONG decrement()
00066 {
00067 return InterlockedDecrement(&val);
00068 }
00069
00070 bool compare_and_swap(LONG expected_value, LONG new_value)
00071 {
00072 return InterlockedCompareExchange(&val, new_value, expected_value) == expected_value;
00073 }
00074
00075 private:
00076 __declspec(align(32)) volatile LONG val;
00077
00078 #else
00079 int get()
00080 {
00081 return __sync_val_compare_and_swap(&val, 0, 0);
00082 }
00083
00084 void set(int new_value)
00085 {
00086 __sync_lock_test_and_set(&val, new_value);
00087 }
00088
00089 int increment()
00090 {
00091 return __sync_fetch_and_add(&val, 1) + 1;
00092 }
00093
00094 int decrement()
00095 {
00096 return __sync_fetch_and_add(&val, -1) - 1;
00097 }
00098
00099 bool compare_and_swap(int expected_value, int new_value)
00100 {
00101 return __sync_val_compare_and_swap(&val, new_value, expected_value) == expected_value;
00102 }
00103
00104 private:
00105 __attribute__ ((aligned(32))) volatile cl_int32 val;
00106
00107 #endif
00108 };
00109