Changeset View
Changeset View
Standalone View
Standalone View
openmp/trunk/runtime/test/omp_testsuite.h
/* Global headerfile of the OpenMP Testsuite */ | /* Global headerfile of the OpenMP Testsuite */ | ||||
#ifndef OMP_TESTSUITE_H | #ifndef OMP_TESTSUITE_H | ||||
#define OMP_TESTSUITE_H | #define OMP_TESTSUITE_H | ||||
#include <stdio.h> | #include <stdio.h> | ||||
#include <stdlib.h> | |||||
#include <omp.h> | #include <omp.h> | ||||
/* General */ | /* General */ | ||||
/**********************************************************/ | /**********************************************************/ | ||||
#define LOOPCOUNT 1000 /* Number of iterations to slit amongst threads */ | #define LOOPCOUNT 1000 /* Number of iterations to slit amongst threads */ | ||||
#define REPETITIONS 10 /* Number of times to run each test */ | #define REPETITIONS 10 /* Number of times to run each test */ | ||||
/* following times are in seconds */ | /* following times are in seconds */ | ||||
#define SLEEPTIME 1 | #define SLEEPTIME 1 | ||||
/* Definitions for tasks */ | /* Definitions for tasks */ | ||||
/**********************************************************/ | /**********************************************************/ | ||||
#define NUM_TASKS 25 | #define NUM_TASKS 25 | ||||
#define MAX_TASKS_PER_THREAD 5 | #define MAX_TASKS_PER_THREAD 5 | ||||
#ifdef _WIN32 | |||||
// Windows versions of pthread_create() and pthread_join() | |||||
# include <windows.h> | |||||
typedef HANDLE pthread_t; | |||||
// encapsulates the information about a pthread-callable function | |||||
struct thread_func_info_t { | |||||
void* (*start_routine)(void*); | |||||
void* arg; | |||||
}; | |||||
// call the void* start_routine(void*); | |||||
static DWORD __thread_func_wrapper(LPVOID lpParameter) { | |||||
struct thread_func_info_t* function_information; | |||||
function_information = (struct thread_func_info_t*)lpParameter; | |||||
function_information->start_routine(function_information->arg); | |||||
free(function_information); | |||||
return 0; | |||||
} | |||||
// attr is ignored | |||||
static int pthread_create(pthread_t *thread, void *attr, | |||||
void *(*start_routine) (void *), void *arg) { | |||||
pthread_t pthread; | |||||
struct thread_func_info_t* info; | |||||
info = (struct thread_func_info_t*)malloc(sizeof(struct thread_func_info_t)); | |||||
info->start_routine = start_routine; | |||||
info->arg = arg; | |||||
pthread = CreateThread(NULL, 0, __thread_func_wrapper, info, 0, NULL); | |||||
if (pthread == NULL) { | |||||
fprintf(stderr, "CreateThread() failed: Error #%u.\n", GetLastError()); | |||||
exit(1); | |||||
} | |||||
*thread = pthread; | |||||
return 0; | |||||
} | |||||
// retval is ignored for now | |||||
static int pthread_join(pthread_t thread, void **retval) { | |||||
int rc; | |||||
rc = WaitForSingleObject(thread, INFINITE); | |||||
if (rc == WAIT_FAILED) { | |||||
fprintf(stderr, "WaitForSingleObject() failed: Error #%u.\n", | |||||
GetLastError()); | |||||
exit(1); | |||||
} | |||||
rc = CloseHandle(thread); | |||||
if (rc == 0) { | |||||
fprintf(stderr, "CloseHandle() failed: Error #%u.\n", GetLastError()); | |||||
exit(1); | |||||
} | |||||
return 0; | |||||
} | |||||
#else | |||||
# include <pthread.h> | |||||
#endif | |||||
#endif | #endif |