1 /* Global headerfile of the OpenMP Testsuite */
2 
3 #ifndef OMP_TESTSUITE_H
4 #define OMP_TESTSUITE_H
5 
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <omp.h>
9 
10 /* General                                                */
11 /**********************************************************/
12 #define LOOPCOUNT 1000 /* Number of iterations to slit amongst threads */
13 #define REPETITIONS 10 /* Number of times to run each test */
14 
15 /* following times are in seconds */
16 #define SLEEPTIME 1
17 
18 /* Definitions for tasks                                  */
19 /**********************************************************/
20 #define NUM_TASKS 25
21 #define MAX_TASKS_PER_THREAD 5
22 
23 #ifdef  _WIN32
24 // Windows versions of pthread_create() and pthread_join()
25 # include <windows.h>
26 typedef HANDLE pthread_t;
27 
28 // encapsulates the information about a pthread-callable function
29 struct thread_func_info_t {
30   void* (*start_routine)(void*);
31   void* arg;
32 };
33 
34 // call the void* start_routine(void*);
__thread_func_wrapper(LPVOID lpParameter)35 static DWORD __thread_func_wrapper(LPVOID lpParameter) {
36   struct thread_func_info_t* function_information;
37   function_information = (struct thread_func_info_t*)lpParameter;
38   function_information->start_routine(function_information->arg);
39   free(function_information);
40   return 0;
41 }
42 
43 // attr is ignored
pthread_create(pthread_t * thread,void * attr,void * (* start_routine)(void *),void * arg)44 static int pthread_create(pthread_t *thread, void *attr,
45                           void *(*start_routine) (void *), void *arg) {
46   pthread_t pthread;
47   struct thread_func_info_t* info;
48   info = (struct thread_func_info_t*)malloc(sizeof(struct thread_func_info_t));
49   info->start_routine = start_routine;
50   info->arg = arg;
51   pthread = CreateThread(NULL, 0, __thread_func_wrapper, info, 0, NULL);
52   if (pthread == NULL) {
53     fprintf(stderr, "CreateThread() failed: Error #%u.\n", GetLastError());
54     exit(1);
55   }
56   *thread = pthread;
57   return 0;
58 }
59 // retval is ignored for now
pthread_join(pthread_t thread,void ** retval)60 static int pthread_join(pthread_t thread, void **retval) {
61   int rc;
62   rc = WaitForSingleObject(thread, INFINITE);
63   if (rc == WAIT_FAILED) {
64     fprintf(stderr, "WaitForSingleObject() failed: Error #%u.\n",
65             GetLastError());
66     exit(1);
67   }
68   rc = CloseHandle(thread);
69   if (rc == 0) {
70     fprintf(stderr, "CloseHandle() failed: Error #%u.\n", GetLastError());
71     exit(1);
72   }
73   return 0;
74 }
75 #else
76 # include <pthread.h>
77 #endif
78 
79 #endif
80