#include #include #include #include #include #include "threadpool/atomic_helpers.h" #include "common/Utilities.h" #include "common/UnitTest.h" #define perr std::cerr #define pout std::cout #define printp printf #if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64) // Using windows #define USE_WINDOWS #define NOMINMAX #include #include #include #elif defined(__APPLE__) // Using MAC #define USE_MAC #include #include #include #elif defined(__linux) || defined(__unix) || defined(__posix) // Using Linux #define USE_LINUX #include #include #else #error Unknown OS #endif #ifdef USE_WINDOWS #include #define TIME_TYPE LARGE_INTEGER #define get_time(x) QueryPerformanceCounter(x) #define get_diff(start,end,f) (((double)(end.QuadPart-start.QuadPart))/((double)f.QuadPart)) #define get_frequency(f) QueryPerformanceFrequency(f) #define sleep(x) Sleep(x*1000) #elif defined(USE_LINUX) || defined(USE_MAC) #include #define TIME_TYPE timeval #define get_time(x) gettimeofday(x,NULL); #define get_diff(start,end,f) (((double)end.tv_sec-start.tv_sec)+1e-6*((double)end.tv_usec-start.tv_usec)) #define get_frequency(f) (*f=timeval()) #else #error Unknown OS #endif // Function to increment/decrement a counter N times struct counter_data { AtomicOperations::counter_t *counter; int N; }; void modify_counter( counter_data *data ) { int N = data->N; AtomicOperations::counter_t &counter = *(data->counter); if ( N > 0 ) { for (int i=0; i thread_ids(N_threads); get_time(&start); for (int i=0; i100e-9 || time_dec_serial>100e-9 || time_inc_parallel>100e-9 || time_dec_serial>100e-9 ) { #if USE_GCOV ut.expected_failure("Time to increment/decrement count is too expensive"); #else ut.failure("Time to increment/decrement count is too expensive"); #endif } else { ut.passes("Time to increment/decrement passed"); } // Finished ut.report(); int N_errors = ut.NumFailGlobal(); return N_errors; }