[llvm] Stop including unordered_map (NFC)
[llvm-project.git] / openmp / runtime / test / omp_testsuite.h
blobef2ae20ec58c777d3d605def7640a769197af982
1 /* Global headerfile of the OpenMP Testsuite */
3 #ifndef OMP_TESTSUITE_H
4 #define OMP_TESTSUITE_H
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <omp.h>
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 */
15 /* following times are in seconds */
16 #define SLEEPTIME 1
18 /* Definitions for tasks */
19 /**********************************************************/
20 #define NUM_TASKS 25
21 #define MAX_TASKS_PER_THREAD 5
23 // Functions that call a parallel region that does very minimal work
24 // Some compilers may optimize away an empty parallel region
25 volatile int g_counter__;
27 // If nthreads == 0, then do not use num_threads() clause
28 static void go_parallel() {
29 g_counter__ = 0;
30 #pragma omp parallel
32 #pragma omp atomic
33 g_counter__++;
37 static void go_parallel_nthreads(int nthreads) {
38 g_counter__ = 0;
39 #pragma omp parallel num_threads(nthreads)
41 #pragma omp atomic
42 g_counter__++;
46 static void go_parallel_spread() {
47 g_counter__ = 0;
48 #pragma omp parallel proc_bind(spread)
50 #pragma omp atomic
51 g_counter__++;
55 static void go_parallel_close() {
56 g_counter__ = 0;
57 #pragma omp parallel proc_bind(close)
59 #pragma omp atomic
60 g_counter__++;
64 static void go_parallel_master() {
65 g_counter__ = 0;
66 #pragma omp parallel proc_bind(master)
68 #pragma omp atomic
69 g_counter__++;
73 static inline int get_exit_value() {
74 return ((g_counter__ == -1) ? EXIT_FAILURE : EXIT_SUCCESS);
77 #ifdef _WIN32
78 // Windows versions of pthread_create() and pthread_join()
79 # include <windows.h>
80 typedef HANDLE pthread_t;
82 // encapsulates the information about a pthread-callable function
83 struct thread_func_info_t {
84 void* (*start_routine)(void*);
85 void* arg;
88 // call the void* start_routine(void*);
89 static DWORD WINAPI __thread_func_wrapper(LPVOID lpParameter) {
90 struct thread_func_info_t* function_information;
91 function_information = (struct thread_func_info_t*)lpParameter;
92 function_information->start_routine(function_information->arg);
93 free(function_information);
94 return 0;
97 // attr is ignored
98 static int pthread_create(pthread_t *thread, void *attr,
99 void *(*start_routine) (void *), void *arg) {
100 pthread_t pthread;
101 struct thread_func_info_t* info;
102 info = (struct thread_func_info_t*)malloc(sizeof(struct thread_func_info_t));
103 info->start_routine = start_routine;
104 info->arg = arg;
105 pthread = CreateThread(NULL, 0, __thread_func_wrapper, info, 0, NULL);
106 if (pthread == NULL) {
107 fprintf(stderr, "CreateThread() failed: Error #%u.\n",
108 (unsigned) GetLastError());
109 exit(1);
111 *thread = pthread;
112 return 0;
114 // retval is ignored for now
115 static int pthread_join(pthread_t thread, void **retval) {
116 int rc;
117 rc = WaitForSingleObject(thread, INFINITE);
118 if (rc == WAIT_FAILED) {
119 fprintf(stderr, "WaitForSingleObject() failed: Error #%u.\n",
120 (unsigned) GetLastError());
121 exit(1);
123 rc = CloseHandle(thread);
124 if (rc == 0) {
125 fprintf(stderr, "CloseHandle() failed: Error #%u.\n",
126 (unsigned) GetLastError());
127 exit(1);
129 return 0;
131 #else
132 # include <pthread.h>
133 #endif
135 #endif